sql >> Databáze >  >> RDS >> Mysql

Proč zde mám NullPointerException?

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.


  1. Aktualizujte řádek v oracle pomocí příkazu OLEDB (SSIS)

  2. Jak povolit obecné protokoly a protokoly chyb v AWS RDS

  3. Vyplnění více tabulek v plachtách vodoryska orm

  4. executemany pro chybu MySQLdb pro velký počet řádků