what is nullpointerexception java how avoid it
Tento tutoriál vysvetlí všetko o výnimke NullPointerException v Jave. Budeme diskutovať o príčinách výnimky nulového ukazovateľa a spôsoboch, ako tomu zabrániť:
NullPointerException v Jave je runtime výnimka. Java priradí odkazu na objekt špeciálnu nulovú hodnotu. Keď sa program pokúsi použiť referenčný objekt nastavený na nulovú hodnotu, je vyvolaná táto výnimka.
=> Dajte si pozor na jednoduchú sériu školení Java tu.
Čo sa dozviete:
NullPointerException v Jave
Ak odkaz na objekt s nulovou hodnotou hodí NullPointerException, tak prečo potrebujeme nulovú hodnotu?
Nulová hodnota sa zvyčajne používa na označenie toho, že referenčnej premennej nebola priradená žiadna hodnota. Po druhé, potrebujeme nulové hodnoty pre kolekcie, ako sú prepojené zoznamy a stromy, ktoré označujú nulové uzly. Dizajnové vzory ako singletonové vzory využívajú nulové hodnoty.
Na záver možno povedať, že nulová hodnota v prostredí Java má mnoho použití. Výnimka nulového ukazovateľa je vyvolaná v špecifických scenároch v Jave.
Niektoré zo scenárov sú tieto:
- Metóda vyvolaná pomocou nulového objektu.
- Prístup alebo úprava poľa alebo údajového člena prázdneho objektu.
- Odovzdanie nulového objektu ako argumentu metóde.
- Výpočet dĺžky nulového poľa.
- Prístup k indexu nulového poľa.
- Synchronizácia nulového objektu.
- Vrhanie nulového objektu.
Výnimka nulového ukazovateľa sa rozširuje z triedy RuntimeException.
Hierarchia NullPointerException je uvedená nižšie.
Ako je znázornené vo vyššie uvedenej hierarchii, výnimka ukazovateľa Null sa rozširuje od výnimky RuntimeException, ktorá dedí triedu výnimiek. Trieda výnimiek je zase odvodená od triedy Throwable, ktorá je podtriedou Object.
Príčiny java.lang.NullPointerException výskytu
Teraz si ukážeme každý zo scenárov výskytu NullPointerException, ktorý sme uviedli vyššie.
# 1) Metóda je vyvolaná pomocou nulového objektu
Zvážte nasledujúci príklad kódu. Máme triedu MyClass, ktorá poskytuje dve metódy. Prvá metóda ‘initT’ vracia prázdny objekt. V hlavnej metóde vytvoríme objekt MyClass s volaním metódy initT.
Ďalej voláme metódu tlače MyClass. Tu sa vyvolá java.lang.NullPointerException, keď voláme metódu tlače pomocou objektu null.
class MyClass { public static MyClass initT() { //method returns a null object return null; } public void print(String s) { System.out.println(s.toLowerCase()); } } class Main{ public static void main(String[] args) { MyClass t = MyClass.initT(); //create a new object (null object) t.print('Hello, World!'); //invoke method using null object } }
Výkon
# 2) Prístupové pole prázdneho objektu
class MyClass { int numField = 100; public static MyClass initT() { //method returns a null object return null; } public void print(String s) { System.out.println(s.toLowerCase()); } } class Main{ public static void main(String[] args) { MyClass t = MyClass.initT(); //create a new object (null object) int num = t.numField; //access MyClass member using null object } }
Výkon
ako otvoriť príponu súboru json
Toto je ďalšia príčina NullPointerException. Tu sa pokúsime získať prístup k členovi triedy pomocou nulového objektu. Objektu t priradíme návratovú hodnotu metódy initT a potom pristúpime k objektu numField pomocou objektu t. Ale objekt t je nulový objekt, pretože initT vracia nulový objekt. V tomto okamihu sa vyvolá java.lang.NullPointerException.
# 3) Odovzdanie nulového objektu ako argumentu
Toto je častá príčina výskytu java.lang.NullPointerException. Zvážte nasledujúci program Java. Máme metódu „print_LowerCase“, ktorá prevádza objekt String odovzdaný ako argument na malé písmená.
public class Main { public static void print_LowerCase(String s) { System.out.println(s.toLowerCase()); } public static void main(String[] args) { print_LowerCase(null); //pass null object as argument to the method } }
Výkon
V hlavnej metóde nazývame túto metódu a ako argument odovzdáme hodnotu null. Pretože objekt String nemôže mať hodnotu null, je vyvolaná java.lang.NullPointerException.
# 4) Získanie dĺžky nulového poľa
Pokus o výpočet dĺžky nulového poľa má za následok aj vyhodenie java.lang.NullPointerException.
Nasledujúci program to demonštruje.
public class Main { public static void main(String[] args) { int[] dataArray = null; //Array is null; no data System.out.println('Array Length:' + dataArray.length); //print array length } }
Výkon
Vo vyššie uvedenom programe deklarujeme pole a priradíme mu hodnotu null, tj. Žiadne údaje. Keď použijeme vlastnosť length na tomto nulovom poli, vyvolá sa NullPointerException.
# 5) Prístupový index nulového poľa
Podobne ako dĺžka, aj keď sa pokúsime získať prístup k hodnote v nulovom poli pomocou indexu, je to príčina java.lang.NullPointerException.
public class Main { public static void main(String[] args) { int[] dataArray = null; //Array set to null //access value at index 2 System.out.println('Value at index 2:' + dataArray[2]); } }
Výkon
Vo vyššie uvedenom programe sa pokúšame získať prístup k hodnote nulového poľa v indexe 2.
# 6) Synchronizácia na nulovom objekte
Zvyčajne synchronizujeme blok alebo metódu na uľahčenie súbežného prístupu. Odkaz na objekt, ktorý používame na synchronizáciu, by však nemal byť nulový. Ak je to nulový objekt, výsledkom bude java.lang.NullPointerException.
Nasledujúci program Java to demonštruje. Ako vidíme, máme objekt String ‘mutex’ inicializovaný na hodnotu null. Potom v hlavnej funkcii použijeme synchronizovaný blok s mutexom ako referenciou objektu. Pretože mutex je nulový, zvyšuje sa java.lang.NullPointerException.
public class Main { public static String mutex = null; //mutex variable set to null public static void main(String[] args) { synchronized(mutex) { //synchronized block for null mutex System.out.println('synchronized block'); } } }
Výkon
# 7) Vyhodením nuly
public class Main { public static void main(String[] args) { throw null; //throw null } }
Výkon:
Vo vyššie uvedenom príkladnom programe sa namiesto vyhodenia platného objektu hodí null. To má za následok výnimku nulového ukazovateľa.
Vyhýbanie sa výnimke nulového ukazovateľa
Teraz, keď sme videli príčiny výskytu NullPointerException, musíme sa tiež pokúsiť vyhnúť sa tomu v našom programe.
Najprv musíme zabezpečiť, aby sa objekty, ktoré používame v našich programoch, správne inicializovali, aby sme sa vyhli použitiu nulových objektov, ktorých výsledkom je výnimka nulového ukazovateľa. Mali by sme sa tiež postarať o to, aby referenčné premenné použité v programe ukazovali na platné hodnoty a nezískali náhodne nulové hodnoty.
Okrem týchto úvah môžeme tiež postupovať opatrnejšie prípad od prípadu, aby sme sa vyhli java.lang.NullPointerException.
Ďalej uvádzame niekoľko prípadov.
# 1) Porovnanie reťazcov s literálmi
Porovnanie reťazcovej premennej a literálu (skutočná hodnota alebo prvok enum) je v programoch Java veľmi častá operácia. Ale ak je premenná String, ktorá je objektom null, potom porovnanie tohto objektu null s literálmi vyvolá NullPointerException.
Riešením teda je vyvolanie porovnávacej metódy z literálu namiesto objektu String, ktorý môže mať hodnotu null.
Nasledujúci program ukazuje, ako môžeme vyvolať porovnávacie metódy z literálov a vyhnúť sa java.lang.NullPointerException.
class Main { public static void main (String[] args) { // String set to null String myStr = null; // Checking if myStr is null using try catch. try { if ('Hello'.equals(myStr)) //use equals method with literal System.out.print('Two strings are same'); else System.out.print('Strings are not equal'); } catch(NullPointerException e) { System.out.print('Caught NullPointerException'); } } }
Výkon
# 2) Skontrolujte argumenty metódy
Skontrolujte argumenty metódy, aby ste sa uistili, že nejde o nulové hodnoty. Ak argumenty nie sú podľa špecifikácie, potom kód vyvolá IllegalArgumentException, čo naznačuje, že argumenty nie sú podľa očakávania.
Toto je zobrazené v nižšie uvedenom programe Java.
import java.io.*; class Main { public static void main (String[] args) { // set String to empty value String myStr = ''; try { System.out.println('String value:' + myStr); System.out.println('String Length:' + getLength(myStr)); } catch(IllegalArgumentException e) { System.out.println('Exception: ' + e.getMessage()); } // Set String to a proper value and call getLength myStr = 'Far from home'; try { System.out.println('String value:' + myStr); System.out.println('String Length:' + getLength(myStr)); } catch(IllegalArgumentException e) { System.out.println('Exception: ' + e.getMessage()); } // Set String to null and call getLength() myStr = null; try { System.out.println('String value:' + myStr); System.out.println('String Length:' + getLength(myStr)); } catch(IllegalArgumentException e) { System.out.println('Exception: ' + e.getMessage()); } } // Method that returns length of the String public static int getLength(String myStr) { if (myStr == null) //throw Exception if String is null throw new IllegalArgumentException('The String argument cannot be null'); return myStr.length(); } }
Výkon
# 3) Použitie ternárneho operátora na starostlivosť o nulové hodnoty
Aby sme sa vyhli java.lang.NullPointerException, môžeme použiť ternárny operátor. Ternárny operátor má troch operátorov. Prvý je boolovský výraz, ktorý sa vyhodnocuje ako pravdivý alebo nepravdivý. Ak je výraz pravdivý, potom sa vráti druhý operátor alebo tretí operátor.
Nasledujúci program ukazuje použitie ternárneho operátora, aby sa zabránilo NullPointerException.
import java.io.*; class Main { public static void main (String[] args) { // Initialize String with null value String myStr = null; //return a substring for this String using ternary oprator String myVal = (myStr == null) ? '' : myStr.substring(0,5); if(myVal.equals('')) System.out.println('Empty String!!'); else System.out.println('String value: ' + myVal); // Now set a value for String myStr = 'SoftwareTestingHelp'; //return a substring for this String using ternary oprator myVal = (myStr == null) ? '' : myStr.substring(0,8); if(myVal.equals('')) System.out.println('Empty String!!'); else System.out.println('String value: ' + myVal); }
Výkon
často kladené otázky
Otázka č. 1) Ako opravím NullPointerException v Jave?
Odpoveď: Musíme zabezpečiť, aby všetky objekty použité v programe boli správne inicializované a aby nemali nulové hodnoty. Referenčné premenné by tiež nemali mať nulové hodnoty.
# 2) Je NullPointerException začiarknuté alebo nezaškrtnuté?
Odpoveď: NullPointerException nie je zaškrtnutá výnimka. Je potomkom RuntimeException a nie je začiarknuté.
# 3) Ako zastavím NullPointerException?
Odpoveď: Niektoré z najlepších postupov, ako sa vyhnúť NullPointerException, sú:
- Použite metódu equals () a equalsIgnoreCase () s reťazcovým literálom namiesto použitia na neznámy objekt, ktorý môže mať hodnotu null.
- Namiesto toString () použite valueOf (); a obaja vrátia rovnaký výsledok.
- Použite anotáciu Java @NotNull a @Nullable.
# 4) Aká je nulová hodnota v Jave?
Odpoveď: Nulová hodnota sa nevzťahuje na žiadny objekt alebo premennú. Je to kľúčové slovo a literál. Predstavuje nulový odkaz.
# 5) Môžeme zachytiť NullPointerException v Jave?
Odpoveď: Výnimka java.lang.NullPointerException je nekontrolovaná výnimka a rozširuje triedu RuntimeException. Programátor teda nie je nútený chytiť ho.
Záver
V tomto tutoriáli sme diskutovali o výnimke NullPointerException v Jave. Toto je dosť nebezpečná výnimka a zvyčajne sa môže zobraziť, keď to najmenej čakáme. Výnimka nulového ukazovateľa sa väčšinou vyskytuje z dôvodu nulového objektu alebo nulovej referencie. Príčiny a spôsoby, ako sa vyhnúť NullPointerException, sme už videli.
Pokiaľ je to možné, programátor by sa mal pokúsiť vyhnúť sa výskytu Null Pointer Exception v programe. Pretože sa jedná o nekontrolovanú runtime výnimku, mali by sme vidieť, že k nej nedochádza pri spustenej aplikácii.
=> Navštívte tu a dozviete sa Java od začiatku.
Odporúčané čítanie
- Výnimky Java a spracovanie výnimiek s príkladmi
- Ako spracovať výnimku ArrayIndexOutOfBoundsException v Jave?
- Výukový program na spracovanie výnimiek C # s príkladmi kódu
- Kompletný sprievodca spracovaním výnimiek PL SQL s príkladmi
- Ako zaobchádzať s výnimkami v skriptoch SoapUI Groovy - SoapUI Tutorial # 11
- Python Try Except - Python Handling Exception with examples
- Spracovanie výnimiek JDBC - Ako zaobchádzať s výnimkami SQL
- Spracovanie výnimiek v C ++