Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Warum habe ich hier NullPointerException?

Anstatt die Ursache im Dunkeln zu suchen, ist es meiner Meinung nach besser zu erklären, wie und warum NPEs verursacht werden und wie sie vermieden werden können, damit das OP das neu gewonnene Wissen anwenden kann, um sein eigenes triviales Problem zu suchen. P>

Sehen Sie, Objektreferenzen (die Variablen) können entweder ein vollwertiges Object enthalten oder einfach nichts , was null ist .

SomeObject someObject1 = new SomeObject(); // References something.
SomeObject someObject2 = null; // References nothing.

Wenn Sie jetzt versuchen, auf nichts zuzugreifen (null ), dann erhalten Sie zweifellos eine NullPointerException , einfach weil null hat keine Variablen oder Methoden.

someObject1.doSomething(); // Works fine.
someObject2.doSomething(); // Throws NullPointerException.

Die Problemumgehung ist ziemlich einfach. Dies kann grundsätzlich auf zwei Arten erfolgen:entweder durch Instanziieren oder einfach durch Ignorieren.

if (someObject2 == null) {
    someObject2 = new SomeObject();
}
someObject2.doSomething(); // No NPE anymore!

oder

if (someObject2 != null) {
    someObject2.doSomething(); // No NPE anymore!
}

Im Falle einer NPE zeigt die erste Zeilennummer des Stacktrace genau auf die Zeile, in der sie verursacht wurde. Sie sagten wörtlich "Zeile 272 ist admin.birthList.add(list1); ". Diese Zeile enthält zwei Stellen, an denen auf Objektreferenzen zugegriffen/aufgerufen wird (mit dem Punkt . Operator). Die erste ist admin.birthList und die zweite ist birthList.add(list1) . Es liegt an Ihnen herauszufinden, ob einer oder beide die NPE verursacht haben. Wenn es der erste Aufruf ist, dann admin ist einfach null . Wenn es der zweite Aufruf ist, dann birthList ist einfach null . Sie können es beheben, indem Sie es mit einem vollwertigen Objekt instanziieren.

Bearbeiten: Wenn es Ihnen schwer fällt, die Grundursache zu bestimmen (wie sich aus den Kommentaren herausstellt), müssen Sie das Debuggen lernen. Führen Sie einen Debugger aus oder führen Sie mit Hilfe von System.out.println() einfach das "Debuggen des armen Mannes" durch jeder Variablen, bevor auf sie zugegriffen/aufgerufen wird. Sehen Sie sich zuerst die Linie an, in der die NPE verursacht wird. Ist dies beispielsweise

admin.birthList.add(list1);

dann müssen Sie es wie folgt ändern, um die Ursache festzunageln:

System.out.println("admin: " + admin);
List<Birth> birthList = admin.birthList;
System.out.println("birthList: " + birthList);
birthList.add(list1);

Prüfen Sie, ob einer von ihnen null ausgibt . Alternativ können Sie auch Folgendes tun:

if (admin == null) throw new NullPointerException("admin is null!");
List<Birth> birthList = admin.birthList;
if (birthList == null) throw new NullPointerException("birthList is null!");
birthList.add(list1);

Sie können die einzelnen Aufrufe auch auf separate Zeilen verteilen, sodass Sie anhand der Zeilennummer wissen, welche Referenz null ist.

List<Birth> birthList = admin.birthList; // If NPE line points here, then admin is null.
birthList.add(list1); // If NPE line points here, then birthList is null.