sql >> Database >  >> RDS >> Mysql

Waarom heb ik hier NullPointerException?

In plaats van in het ongewisse op zoek te gaan naar de oorzaak, denk ik dat het beter is om uit te leggen hoe en waarom NPE's worden veroorzaakt en hoe ze kunnen worden vermeden, zodat de OP de nieuw opgedane kennis kan toepassen om zijn/haar eigen triviale probleem op te sporen.

Kijk, objectverwijzingen (de variabelen) kunnen ofwel een volwaardig Object . bevatten of gewoon niets , wat null . is .

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

Als u nu probeert toegang te krijgen tot niets (null ), dan krijgt u ongetwijfeld een NullPointerException , simpelweg omdat null heeft geen variabelen of methoden.

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

Het omzeilen hiervan is vrij eenvoudig. Het kan in principe op twee manieren worden gedaan:ofwel door het te instantiëren of door het gewoon te negeren.

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

of

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

In het geval van een NPE wijst het eerste regelnummer van de stacktrace de exacte lijn aan waar het is veroorzaakt. Je zei letterlijk "regel 272 is admin.birthList.add(list1); ". Deze regel bevat twee plaatsen waar objectverwijzingen worden geopend/aangeroepen (met behulp van de punt . exploitant). De eerste is admin.birthList en de tweede is birthList.add(list1) . Het is aan jou om uit te zoeken of een of beide de NPE hebben veroorzaakt. Als het de eerste aanroep is, dan admin is gewoon null . Als het de tweede aanroep is, dan birthList is gewoon null . Je kunt het repareren door het te instantiëren met een volledig waardig object.

Bewerken: Als je het moeilijk vindt om de hoofdoorzaak te bepalen (zoals blijkt uit opmerkingen), dan moet je debuggen leren. Voer een debugger uit of doe "poor man's debugging" met behulp van een System.out.println() van elke variabele voordat u ze opent/oproept. Kijk eerst naar de regel waar de NPE wordt veroorzaakt. Als dit bijvoorbeeld

. is
admin.birthList.add(list1);

dan moet je het als volgt veranderen om de oorzaak te achterhalen:

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

controleer of een van deze null prints afdrukt . U kunt ook het volgende doen:

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

je kunt de afzonderlijke aanroepingen ook over afzonderlijke regels scheiden, zodat je genoeg hebt om het regelnummer te weten welke verwijzing null is.

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. Dynamische vervolgkeuzelijstwaarde uit database

  2. Converteer TIMESTAMP-verschilkolomgegevens naar tekenreeksindeling

  3. Hoe ga ik om met NULL-waarden in een mysql SELECT ... OUTFILE-instructie in combinatie met FIELDS ESCAPED BY? NULL-waarden worden momenteel afgekapt

  4. SQL SELECT speed int vs varchar