sql >> Database teknologi >  >> RDS >> Mysql

Hvorfor har jeg NullPointerException her?

I stedet for at jage den grundlæggende årsag i mørke, synes jeg, det er bedre at forklare, hvordan og hvorfor NPE'er er forårsaget, og hvordan de kan undgås, så OP kan anvende den nyvundne viden til at jage sit eget trivielle problem.

Se, objektreferencer (variablerne) kan enten indeholde et fuldværdigt Object eller simpelthen ingenting , som er null .

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

Hvis du nu prøver at få adgang til intet (null ), så får du uden tvivl en NullPointerException , simpelthen fordi null har ingen variabler eller metoder.

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

Løsningen af ​​dette er ret enkel. Det kan gøres på grundlæggende to måder:enten ved at instansiere det eller blot ved at ignorere det.

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

eller

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

I tilfælde af en NPE, peger det første linjenummer på stacktrace den nøjagtige linje, hvor det er forårsaget. Du fortalte bogstaveligt "linje 272 er admin.birthList.add(list1); ". Denne linje indeholder to steder, hvor objektreferencer er blevet tilgået/kaldet (ved hjælp af prikken .). operatør). Den første er admin.birthList og den anden er birthList.add(list1) . Det er op til dig at finde ud af, om den ene eller begge forårsagede NPE. Hvis det er den første påkaldelse, så admin er simpelthen null . Hvis det er den anden påkaldelse, så birthList er simpelthen null . Du kan rette det ved at instansiere det med et fuldt værdigt objekt.

Rediger: Hvis du har svært ved at bestemme årsagen (som det viser sig fra kommentarer), så skal du lære at fejlfinde. Kør en debugger eller bare lav "fattigmands debugging" ved hjælp af en System.out.println() af hver variabel, før du får adgang til/kalder dem. Se først på linjen, hvor NPE er forårsaget. Hvis dette f.eks. er

admin.birthList.add(list1);

så skal du ændre det som følger for at finde ud af årsagen:

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

tjek om nogen af ​​dem udskriver null . Alternativt kan du også gøre:

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 også adskille de enkelte opkald over separate linjer, så du har nok til linjenummeret til at vide, hvilken reference der er nul.

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. MYSQL Update Trigger få opdateret række-id

  2. MySQL / MariaDB unik BLOB af fast længde

  3. Hvad er ydeevneforskellen mellem indsæt ignorere og erstat i MySQL?

  4. Bærbar SQL-upsert-løsning (indsæt+opdatering) er nødvendig