سؤال

ظننت جافا قد كهربائى التقييم, إلا أن هذا الخط لا يزال رمي استثناء مؤشر فارغة:

if( (perfectAgent != null) && (perfectAgent.getAddress().equals(entry.getKey())) ) {

في هذه الحالة perfectAgent هو null, أنا فقط أريد التعبير العودة false, لكن التطبيق لا يزال تحطمها على هذا الخط مع NullPointerException.

تحرير الرد العام:

منذ perfectAgent هو null, لا شيء على حق && ينبغي تنفيذها ، كما أنه من المستحيل على التعبير أن يكون صحيحا.أكثر لهذه النقطة, فمن المستحيل أن تنفيذ perfectAgent.getAddress() منذ perfectAgent لا يحتوي على مرجعية صالحة (كونها فارغة وجميع).أحاول استخدام دائرة كهربائية قصيرة التقييم يكن لديك للتحقق فارغة في بيان منفصل كما أن يجعل المنطق أكثر قذرة.

تحرير 2 (أو أنا أحمق):نعم, مثل أشياء كثيرة في الحياة يمكنك معرفة الجواب الصحيح بعد أن أعلن للعالم أن كنت أحمق.في هذه الحالة, كان إيقاف الكسوف autobuild أثناء القيام بشيء آخر وليس ذلك لذا كنت التصحيح فئة الملفات التي لم تتطابق مع المصدر.

هل كانت مفيدة؟

المحلول

التصحيح المتقدمة الدرس #1:

إذا واجهت على ما يبدو من المستحيل خطأ (على سبيل المثالواحد الذي يتعارض كنت المعرفة حول جافا) ، قم بما يلي:

  • استشارة السمعة نص الكتاب (أو الأفضل من ذلك ، ذات الصلة القياسية) للتأكد من أن لديك فهم ليست معيبة.(في هذه الحالة فهمك الصحيح ، أي نصف لائق كتاب تأكيد هذا في دقيقة واحدة.)

  • تحقق من كل من الأشياء الغبية التي كنت قد فعلت هذا يمكن أن يسبب المستحيل خطأ.أشياء مثل عدم حفظ الملف ، لا تفعل كاملة بناء, تشغيل قديم / نسخة قديمة من التطبيق ، ويجري في الدليل خاطئ ، وهلم جرا.

في ملخص, تعلم أن تشك في نفسك أكثر قليلا.

نصائح أخرى

إذا perfectAgent باطل حقا، ذلك الرمز <م> لن بطرح استثناء (على الأقل على افتراض هناك أشياء خيوط لا غريبة مستمرة، تغييرها من غير لاغية فارغة في منتصف الطريق من خلال التعبير). سأكون صدمت تماما إذا كنت يمكن أن تنتج برنامجا قصيرة ولكن كاملة مما يدل على أن القيام بذلك.

وهكذا نعم، والحدس الخاص بك هو الصحيح - وهذا لا ينبغي أن يكون مشكلة. في مكان آخر عن السبب. أشك بقوة أن perfectAgent <م> ليس اغيا في الواقع، وأنك تقوم بتشغيل في أي من الحالات الأخرى في هذا الرمز الذي يمكن أن يسبب استثناء.

وأقترح عليك محاولة استخراج أن قليلا من التعليمات البرمجية للخروج الى مثال قصيرة ولكن كاملة - إذا كنت تستطيع أن تفعل ذلك، وأنا أكل قبعتي مجازي. إذا لم يكن كذلك، عليك أن نأمل العثور على مشكلة أثناء محاولة استخراج.

ما الذي يجعلك تعتقد أن perfectAgent حقا <م> هو باطلة؟ حاول إدراج هذا الرمز قبل ذلك:

if (perfectAgent == null)
{
    System.out.println("Yup, it's null");
}

وهناك احتمال آخر جدا، ضئيلة جدا هي أن كنت قد واجهت خطأ JIT - ولكن أشك بشدة.

وجافا <م> لا لدينا تقييم ماس كهربائى. ربما entry هو null وذلك entry.getKey() يسبب NullPointerException. والاحتمال الآخر هو أن getAddress() إما بإرجاع null أو لديه NullPointerException يحدث داخل مكان ما (إذا كان أكثر تعقيدا من مجرد بيان return بسيط).

وتحرير: أرى تحرير الخاص بك حيث تدعون هذا:

<اقتباس فقرة>   

وأكثر لهذه النقطة، فإنه من المستحيل لتنفيذ perfectAgent.getAddress() ...

ولكن ماذا لو perfectAgent.getAddress() <م> هو نفذت بنجاح و<م> عودة null؟ ترى ما أعنيه ...

يمكنك التأكد من أن perfectAgent ليست فارغة ، إذا واحد أو أكثر من perfectAgent.getAddress() أو entry أو entry.getKey() يجب أن تكون فارغة.أو getAddress() أو getKey() هي ضرب NPE في تنفيذها.

لتصحيح هذا النوع من الشيء ، ننظر أولا في تتبع المكدس إلى دبوس أسفل الموقع.هذا سوف أقول لكم إذا كان يحدث في getAddress() أو في getKey() أو في لصق التعليمات البرمجية المتكررة التي تدعو لها.التالي, إذا كان في هذا مقتطف إضافة بعض التعليمات البرمجية قبل لو أن الاختبار الذي فارغة.يمكنك استخدام جيد النظام القديم.يخطئ.println() أو التأكيدات.(إذا كنت تستخدم التأكيدات ، تأكد من تمكين لهم مع جافا القيادة -enableassertions العلم.)

تحديث: لذا تفسير تحولت إلى أن تكون خاطئة ...المشكلة قدمت اثنين من الحقائق المتناقضة (كان هناك NPE على هذا الخط وبعد قصيرة-الدائرة يجب أن يكون قد حدث) وأنا تلقائيا يفترض الأول الواقع كان صحيحا والثانية كاذبة في حين أنها في الواقع مشكلة مختلفة تماما بسبب إيقاف السيارات-بناء في الكسوف.دوه!في تصحيح شيء "مستحيل" هذا يساعد على أن يكون جذريا متشككا.

هناك ثلاث إشارات أخرى من perfectAgent التي يمكن أن تكون فارغة:

  • perfectAgent.getAddress()
  • دخول
  • الدخول.getKey()

تفريق بيان أو تشغيله في المصحح.

وميستري كبير. أنا نسخ الخط الخاص بك من التعليمات البرمجية واختبارها مع perfectAgent == null، entry == null، entry.getKey() == null ومجموعات من تلك: لا NPE في سريري اختبار (جافا 1.6).

مهما كانت الأخطاء مزعج هو، أشك في أن لديها ما تفعله مع تقييم ماس كهربائى. اذا كان هذا الخط مما تسبب NPE، من، بقدر ما أستطيع أن أقول، perfectAgent ليس لاغية. حظا سعيدا و- تبين لنا علة بمجرد catched ذلك:)

وحاول تنسيق التعليمات البرمجية الخاصة بك مثل هذا:

if( 
  (perfectAgent != null) 
  && (
      perfectAgent.getAddress()
      .equals(
       entry.getKey()
      )
     ) 
  ) {

ويمكن أن تعطيك كومة دخول خط أثر أفضل.

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