sql >> Databasteknik >  >> RDS >> Mysql

Varför har jag NullPointerException här?

Istället för att jaga grundorsaken i mörker tycker jag att det är bättre att förklara hur och varför NPE orsakas och hur de kan undvikas, så att OP kan tillämpa den nyvunna kunskapen för att jaga sitt eget triviala problem.

Titta, objektreferenser (variablerna) kan innehålla antingen ett fullvärdigt Object eller helt enkelt ingenting , vilket är null .

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

Nu, om du försöker komma åt ingenting (null ), så kommer du utan tvekan att få en NullPointerException , helt enkelt för att null har inga variabler eller metoder.

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

Att lösa detta är ganska enkelt. Det kan göras på i princip två sätt:antingen genom att instansiera det eller bara genom att ignorera det.

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

eller

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

I händelse av en NPE, pekar det första radnumret i stacktrace den exakta linjen där det orsakades. Du sa bokstavligen "rad 272 är admin.birthList.add(list1); ". Den här raden innehåller två platser där objektreferenser nås/anropas (med hjälp av punkten .). operatör). Den första är admin.birthList och den andra är birthList.add(list1) . Det är upp till dig att ta reda på om en eller båda orsakade NPE. Om det är den första anropet, då admin är helt enkelt null . Om det är det andra anropet, då birthList är helt enkelt null . Du kan fixa det genom att instansiera det med ett fullvärdigt objekt.

Redigera: Om du har svårt att fastställa grundorsaken (som visar sig från kommentarer), måste du lära dig felsökning. Kör en debugger eller gör bara "fattigmans felsökning" med hjälp av en System.out.println() av varje variabel innan du kommer åt/anropar dem. Titta först på linjen där NPE orsakas. Om detta till exempel är

admin.birthList.add(list1);

sedan måste du ändra det på följande sätt för att fastställa grundorsaken:

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

kontrollera om någon av dem skriver ut null . Alternativt kan du också göra:

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);

du kan också separera de enskilda anropen över separata rader så att du har tillräckligt med radnumret för att veta vilken referens som är noll.

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.


  1. Fixa "Arithmetic overflow-fel vid konvertering av int till datatyp numeric" i SQL Server

  2. Meddelande om ändring av Oracle Database

  3. Oracle PL/SQL:ta bort blanksteg från en sträng

  4. Syntaxfel:WITH är inte giltig inmatning i denna position