سؤال

رمي الكود التالي 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. أخيرًا ، عندما يقوم برنامجك بالقيم البدائية ، يمكن أن يؤدي إلى إبداعات الكائنات المكلفة وغير الضرورية.

هناك أماكن لا يوجد فيها خيار سوى استخدام البدائيات المعبأة ، على سبيل المثال ، ولكن يجب أن تفكر بجدية في ما إذا كان هناك قرار باستخدام البدائية المعبأة له ما يبرره.

أسئلة ذات صلة

نصائح أخرى

من 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").

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top