لماذا int num = integer.getInteger ("123") يرمي nullpointerxception؟
-
30-09-2019 - |
سؤال
رمي الكود التالي NullPointerException
:
int num = Integer.getInteger("123");
هو المترجم الخاص بي يستدعي getInteger
على NULL لأنه ثابت؟ هذا لا معنى له!
ماذا يحدث؟
المحلول
الصورة الكبيرة
هناك مسألتان في اللعب هنا:
Integer getInteger(String)
لا تفعل ما تعتقد أنه يفعله- يعود
null
في هذه الحالة
- يعود
- المهمة من
Integer
إلىint
يسبب تلقائيا-عدم الاكتشاف- منذ
Integer
هوnull
,NullPointerException
هذا خطئ
- منذ
لتحليل (String) "123"
إلى (int) 123
, ، يمكنك استخدام EG int Integer.parseInt(String)
.
مراجع
Integer
مراجع API
على Integer.getInteger
إليك ما تقوله الوثائق حول ما تفعله هذه الطريقة:
public static Integer getInteger(String nm)
: يحدد قيمة عدد صحيح لخاصية النظام مع الاسم المحدد. إذا لم يكن هناك خاصية تحمل الاسم المحدد ، إذا كان الاسم المحدد فارغًا أوnull
, ، أو إذا لم يكن للخاصية التنسيق الرقمي الصحيح ، إذنnull
يتم إرجاع.
بمعنى آخر ، هذه الطريقة لا علاقة لها بتحليل أ String
إلى int/Integer
القيمة ، ولكن بالأحرى ، لها علاقة System.getProperty
طريقة.
من المسلم به أن هذا يمكن أن يكون مفاجأة كبيرة. من المؤسف أن المكتبة لديها مفاجآت مثل هذه ، لكنها تعلمك درسًا قيمًا: ابحث دائمًا عن الوثائق لتأكيد ما تفعله الطريقة.
من قبيل الصدفة ، تم تقديم تباين في هذه المشكلة في عودة الألغاز: شلوك ورهبة (TS-5186), ، Josh Bloch و Neal Gafter's Javaone Technical Session لعام 2009. ها هي الشريحة الختامية:
المعنوية
- طرق غريبة ورهيبة تكمن في المكتبات
- البعض لديه أسماء صوتية غير ضارة
- إذا أسيء التصرف في الكود الخاص بك
- تأكد من استدعاء الأساليب الصحيحة
- اقرأ وثائق المكتبة
- لمصممي API
- لا تنتهك مبدأ أدنى دهشة
- لا تنتهك التسلسل الهرمي للتجريد
- لا تستخدم أسماء مماثلة لسلوكيات مختلفة بشكل كبير
من أجل الاكتمال ، هناك أيضًا هذه الطرق التي تشبه Integer.getInteger
:
أسئلة ذات صلة
على Autounboxing
القضية الأخرى ، بالطبع ، هي كيف NullPointerException
يتم إلقاؤه. للتركيز على هذه المشكلة ، يمكننا تبسيط المقتطف على النحو التالي:
Integer someInteger = null;
int num = someInteger; // throws NullPointerException!!!
إليك اقتباس من الإصدار 2nd الفعال Java ، البند 49: تفضل الأنواع البدائية على البدائية المعبأة:
باختصار ، استخدم البدائية في التفضيل إلى البدائية المعبأة كلما كان لديك الخيار. الأنواع البدائية أبسط وأسرع. إذا كان يجب عليك استخدام البدائيات المعبأة ، كن حذرا! يقلل Autoboxing من الأناقة ، ولكن ليس الخطر ، لاستخدام البدائية المعبأة. عندما يقارن برنامجك اثنين من البدائيين المعبدين مع
==
المشغل ، يقوم بمقارنة الهوية ، وهو بالتأكيد ليس ما تريده. عندما يقوم برنامجك بإجراء حسابات مختلطة تتضمن بدايات محاصر وغير مصنوعة من ذلك ، فإنه لا يلفت التفسير ، وعندما يقوم برنامجك بإلغاء التفسير ، يمكن أن يرميNullPointerException
. أخيرًا ، عندما يقوم برنامجك بالقيم البدائية ، يمكن أن يؤدي إلى إبداعات الكائنات المكلفة وغير الضرورية.
هناك أماكن لا يوجد فيها خيار سوى استخدام البدائيات المعبأة ، على سبيل المثال ، ولكن يجب أن تفكر بجدية في ما إذا كان هناك قرار باستخدام البدائية المعبأة له ما يبرره.
أسئلة ذات صلة
- ما هو الفرق بين int و integer في Java/C#؟
- لماذا يسمح لي Autoboxing في Java بالحصول على 3 قيم محتملة لـ Boolean؟
- هل مضمون أن عدد صحيح جديد (i) == أنا في جافا؟ (نعم!!!)
- عند مقارنة اثنين من الأعداد الصحيحة في Java هل يحدث عدم وجود Auto-Unboxing؟ (رقم!!!)
- Java Noob: Generics على الأشياء فقط؟ (نعم للأسف)
نصائح أخرى
من http://konigsberg.blogspot.com/2008/04/IntegergetInteger-are-you-kidding-me.html:
GetInteger "يحدد قيمة عدد صحيح لخاصية النظام مع الاسم المحدد."
انت تريد هذا:
Integer.parseInt("123")
يرجى التحقق من وثائق الطريقة getInteger (). في هذه الطريقة ، String
المعلمة هي خاصية النظام التي تحدد قيمة عدد صحيح لخاصية النظام مع الاسم المحدد. "123" ليس اسم أي خاصية للنظام ، كما تمت مناقشته هنا. إذا كنت تريد تحويل هذه السلسلة إلى int
, ، ثم استخدم الطريقة باسمint num = Integer.parseInt("123")
.