2013-12-10 5 views
1

Теперь у меня есть некоторые из этих исключений, и я всегда изо всех сил пытаюсь их решить, поэтому любые руководства или советы о том, как их исправить, были бы великолепны, вместо того, чтобы полагаться на других, чтобы помочь им в этом. В настоящее время у меня есть один совет о том, как исправить это было бы оценено, но и советы в целом о том, как отслеживать причину проблем, было бы лучше в долгосрочной перспективе.Каков наилучший способ отслеживания NullPointerExceptions?

class Egg extends Bee{ 
    protected void anotherDay() { 

     eat(); 
     if(age>=3) 
     { 
      HashMap<String, Hive> thisHive = Garden.GARDEN.getHiveMap(); 
      Larvae larvae = new Larvae(this.health, this.age); 
      thisHive.get("a").bees.set(thisHive.get("a").beeIndex, larvae); //-------LINE 27 
      //thisHive.get("a").replaceBee(larvae) Line 27 was origionally this throwing the same exception 

     } 
     age++; 
     System.out.println("Egg" + " age " + this.age + " health " + this.health); 

    } 
} 

import java.util.ArrayList; 

class Hive { 
    protected int honey; 
    protected int royalJelly; 
    protected int pollen; 
    public int beeIndex; // used to know what the index of bee you are in is 
    public boolean holdAdd; 
    ArrayList<Bee> bees = new ArrayList<Bee>(); 
    protected Hive(int honeyStart, int royalJellyStart, int pollenStart) 
    { 
     bees = new ArrayList<Bee>(); 
     this.setHoney(honeyStart); 
     this.setRoyalJelly(royalJellyStart); 
     this.setPollen(pollenStart); 
     System.out.println("hive made"); 
     System.out.println(honey + " honey"); 
     System.out.println(royalJelly + " royalJelly"); 
     System.out.println(pollen + " pollen"); 
     holdAdd = false; 
    } 
    //code removed ... 

    public void replaceBee(Bee addBee) { 
     bees.set(beeIndex, addBee); 
    } 

    // code removed 

    protected void anotherDay() { 
     int i = 0; 
     for(int k = 0; k < bees.size(); k++) 
     { 
      i++; 
      Bee bee = bees.get(k); 
      bee.anotherDay(); // ----------------LINE 144 
      beeIndex = i; 
     } 
     // code removed 
    } 
} 


public class Garden { 

    static HashMap<String, Hive> HiveMap = new HashMap<String, Hive>(); 
    public static final Garden GARDEN = new Garden(); 
    public static void main(String[] args) { 
      GARDEN.anotherDay(); //------------------LINE 21 
     } 
    } 

    //CODE REMOVED 

    public HashMap<String, Hive> getHiveMap() 
    { 
     return Garden.HiveMap; 
    } 
    // CODE REMOVED 


    protected void anotherDay() { 
     //CODE REMOVED 

     //should find all Hives and call anotherday() on them each 

     for(Hive currentHive : HiveMap.values()){ 
      currentHive.anotherDay(); //------------LINE 56 
     } 

     } 
     //CODE REMOVED 
} 
+8

StackTrace дает линию, где происходит NullPointer. Если нулевой указатель можно выбросить только из одного места в конкретной строке, то вы знаете, какая переменная была нулевой и вызвала исключение. Если в этой строке есть несколько возможностей, отладчик поможет. Затем просто отмените стек вызовов, чтобы найти, где появился null. – Tobb

+1

Ну, если вы пытаетесь ссылаться на объект, который является нулевым, а этот объект МОЖЕТ быть нулевым, проверьте, имеет ли он значение null перед доступом. Если объект никогда не должен быть нулевым, тогда у вас есть логическое условие ошибки в вашем коде, и вам нужно выяснить, почему. – OldProgrammer

+0

Ваш код кажется неуместным для вашего вопроса. Какая связь между ними? Вы просите нас отладить его для вас? – Raedwald

ответ

4

Если у вас есть StackTrace, NullPointerExceptions, как правило, легко определить с немного практики: Оно происходит от вызова метода или ссылки на свойство объекта, который является нулевым. Итак, посмотрите на строку, о которой сообщается, и посмотрите, на какие объекты ссылаются. В вашем примере:

thisHive.get("a").bees.set(thisHive.get("a").beeIndex, larvae); 

Can thisHive be null? что делает get("a") возвращение? Может ли оно быть нулевым? (да, это возможно, потому что карта возвращает null, если ключ не найден). Can bees be null? И т. Д. Вы можете часто заметить, что он просто смотрит на код, но отладчик делает его еще проще. Установите контрольную точку в строке и посмотрите, что равно null. Затем перейдите в обратную сторону, чтобы понять, почему она равна нулю.

Одна вещь, чтобы быть в курсе, Autoboxing: если у вас есть переменная, объявленная в качестве класса-оболочки (Long, Integer, Boolean и т.д.) и вы ссылаться на него как примитив, вы получите NPE:

private int getMyInt() { 
    Integer myInt = null; 
    return myInt; 
} 

private void doSomething() { 
    int i = getMyInt(); 
} 
5

NullPointerException ситуация в коде, где вы пытаетесь получить доступ/изменить объект, который не был инициализирован еще.

В идеале вы не должны исправлять NPE, но вам нужно убедиться, что вы не работаете/вызываете объект Null.

  • Несколько сценариев вы получите NPE
  • методы, ссылающегося на объект, который не инициализирован
  • Параметры, передаваемые в метода нуль Использование
  • синхронизируются на объект, который нуль
  • Ключ к Hashtable - null
  • Целевой метод вызова в одном виде

Как мы работаем безопасно

1. Лучше практика кодирования

например 1: улучшение стиля кодирования

String s=getValue(); 
// this is error prone 
if(s.equals("SOMEVALUE"){ 
} 
// Rather you can check for 
if("SOMEVALLUE".equals(s)){ 

} 

ЭГ2: Не возвращайте Null как тип возвращаемого объекта, скажем, если вы хотите вернуть список, а вместо возврата null вы можете попробовать Collections.emptyList()

public List getEmpList(){ 
    // some operation 
    if(exp) { 
     return List 
    } 
    else{ 
     return Collections.emptyList(); //dont return null 
    } 

    } 

2. Обеспечьте достаточное покрытие для тестирования.

NPE - это RunTimeException, вы можете уловить большую часть RTE из тестовых классов.

3. Отбить Прохождение Null Параметры

Но есть некоторые места, которые вы должны поддерживать NPE

Джошуа Блох в Effective Java говорит, что «Можно утверждать, что все ошибочные вызов метода кипеть вплоть до незаконного аргумента или незаконного состояния, , но другие исключения стандартно используются для определенных видов незаконных аргументов и состояний . Если абонент передает нуль в некотором параметре для которых нулевые значения запрещены, Конвенция требует, чтобы NullPointerException быть выброшен, а не IllegalArgumentException.»

0

Мой совет, чтобы быть коротким и не делать слишком много вложенных инлайн вызов. Если вы получите ошибку в строке, как показано ниже, будет сложно определить, какой объект был null.

thisHive.get("a").bees.set(thisHive.get("a").beeIndex, larvae) . 
+0

origionally Эта строка была thisHive.get ("a"). ReplaceBee (личинки); но он бросает nullException перед тем, как перейти в функцию replaceBee(), не зная, что происходит, я пытался сделать это другим способом, чтобы увидеть, что произошло. Если KeySet имеет значение null, в этом случае KeySet вызывает нулевое исключение – user1642671

1

Вы можете установить точку останова для NPE в своем отладчике, поэтому она всегда будет останавливаться, когда они появятся, показывая вам содержимое фрейма стека (поля и объекты). Вот как вы можете сделать это с идеей:

enter image description here

enter image description here

Смежные вопросы