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
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.