جافا: باطل مؤشر استثناء عند علبته صحيح؟
-
06-07-2019 - |
سؤال
ويسبب هذا الرمز استثناء مؤشر فارغة. ليس لدي أي فكرة عن السبب:
private void setSiblings(PhylogenyTree node, Color color) throws InvalidCellNumberException {
PhylogenyTree parent = node.getParent();
for (PhylogenyTree sibling : parent.getChildren()) {
if (! sibling.equals(node)) {
Animal animal = sibling.getAnimal();
BiMap<PhylogenyTree, Integer> inverse = cellInfo.inverse();
int cell = inverse.get(animal); // null pointer exception here
setCellColor(cell, color);
}
}
}
ولقد بحثت في المصحح، وجميع المتغيرات المحلية غير قابلة للباطل. وإلا كيف يمكن لهذا أن يحدث؟ وBiMap هو من مجموعات جوجل.
المحلول
والاستثناء لاغية المؤشر هو نتيجة علبته نتيجة inverse.get(animal)
. إذا لم inverse
تحتوي على animal
مفتاح، فإنها ترجع null
"من نوع" Integer
. وبالنظر إلى أن التعيين هو إشارة int
، جافا unboxes قيمة إلى int
، مما أدى إلى استثناء مؤشر فارغة.
ويجب عليك إما تحقق من inverse.containsKey(animal)
أو استخدام Integer
كنوع المتغير المحلي لتجنب علبته والتصرف وفقا لذلك. الآلية المناسبة يعتمد على السياق الخاص بك.
نصائح أخرى
والتحقق من وجود inverse.containsKey(animal), BiMap<PhylogenyTree, Integer>
. معكوس قد لا يكون الحيوان.
ويجب أن يكون لديك تتبع مكدس الذاكرة المؤقتة. وتقول بالضبط ما كان السطر حيث حدث ذلك. بعد ذلك ويمكننا ان نقول.
ومن كافة التعليمات البرمجية نشرها، ويمكنني أن "تخمين" واحدة من هذه هي NullPointerException المحتملين (NPE).
قد يكون node
لاغية وتدعو node.getParent
.
ويمكن أن تكون الأم والعقدة لاغيا والاحتجاج parent.getChildren
قد بطرح NPE.
واحدة من الأشقاء قد يكون لاغيا والاحتجاج sibling.equals
قد رمي NPE.
قد يكون cellInfo اغيا وسوف cellInfo.inverse
رميها.
وأخيرا "معكوس" عاد قد يكون لاغيا وسوف inverse.get()
رميها.
وتفو !! ...
وهكذا، لتجنب القيام بذلك guessings البرية، لماذا لا مجرد وظيفة تتبع مكدس الذاكرة المؤقتة ونكتشف؟
ووينبغي شيء من هذا القبيل:
java.lang.NullPointerException: null
at YourClass.setSiblings( YouClass.java:22 )
at YourClass.setSiblng( YourClass.java: XX )
والخ ...