Namísto hledání hlavní příčiny ve tmě si myslím, že je lepší vysvětlit, jak a proč jsou NPE způsobeny a jak se jim lze vyhnout, aby OP mohl použít nově získané znalosti k hledání svého vlastního triviálního problému.
Podívejte, odkazy na objekty (proměnné) mohou obsahovat buď plnohodnotný Object
nebo jednoduše nic , což je null
.
SomeObject someObject1 = new SomeObject(); // References something.
SomeObject someObject2 = null; // References nothing.
Nyní, pokud se pokoušíte získat přístup k nic (null
), pak nepochybně dostanete NullPointerException
, jednoduše proto, že null
nemá žádné proměnné ani metody.
someObject1.doSomething(); // Works fine.
someObject2.doSomething(); // Throws NullPointerException.
Toto řešení je poměrně jednoduché. To lze provést v zásadě dvěma způsoby:buď vytvořením instance, nebo pouhým ignorováním.
if (someObject2 == null) {
someObject2 = new SomeObject();
}
someObject2.doSomething(); // No NPE anymore!
nebo
if (someObject2 != null) {
someObject2.doSomething(); // No NPE anymore!
}
V případě NPE, číslo prvního řádku stacktrace ukazuje přesný řádek, kde byl způsoben. Řekl jsi doslova "řádek 272 je admin.birthList.add(list1);
". Tento řádek obsahuje dva místa, kde se přistupuje/vyvolává odkazy na objekty (pomocí tečky .
operátor). První je admin.birthList
a druhý je birthList.add(list1)
. Je na vás, abyste zjistili, zda jeden nebo oba způsobili NPE. Pokud se jedná o první vyvolání, pak admin
je jednoduše null
. Pokud je to druhé vyvolání, pak birthList
je jednoduše null
. Můžete to opravit vytvořením instance s plně hodnotným objektem.
Upravit: Pokud máte potíže s určením hlavní příčiny (jak vyplývá z komentářů), musíte se naučit ladit. Spusťte ladicí program nebo prostě proveďte "ladění chudáka" pomocí System.out.println()
všech proměnných před jejich přístupem/vyvoláním. Nejprve se podívejte na řádek, kde je způsobeno NPE. Pokud je to například
admin.birthList.add(list1);
pak jej musíte změnit následovně, abyste odhalili hlavní příčinu:
System.out.println("admin: " + admin);
List<Birth> birthList = admin.birthList;
System.out.println("birthList: " + birthList);
birthList.add(list1);
zkontrolujte, zda některá z nich nepíše null
. Případně můžete také:
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);
můžete také oddělit jednotlivá vyvolání na samostatných řádcích, abyste měli dostatek čísla řádku, abyste věděli, který odkaz je nulový.
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.