what is nullpointerexception java how avoid it
Tento kurz vysvětlí vše o výjimce NullPointerException v Javě. Budeme diskutovat o příčinách výjimky nulového ukazatele a způsobech, jak tomu zabránit:
NullPointerException v Javě je runtime výjimka. Java přiřadí referenční hodnotě objektu speciální nulovou hodnotu. Když se program pokusí použít referenční sadu objektů na hodnotu null, je vyvolána tato výjimka.
=> Dávejte pozor na jednoduchou sérii školení Java zde.
Co se naučíte:
NullPointerException v Javě
Pokud odkaz na objekt s hodnotou null vyvolá NullPointerException, tak proč potřebujeme hodnotu null?
Hodnota null se obvykle používá k označení, že referenční hodnotě nebyla přiřazena žádná hodnota. Za druhé, potřebujeme nulové hodnoty pro kolekce, jako jsou propojené seznamy a stromy, které označují nulové uzly. Návrhové vzory, jako jsou singletonové vzory, využívají nulové hodnoty.
Závěrem lze říci, že nulová hodnota v Javě má mnoho využití. Výjimka nulového ukazatele je vyvolána v konkrétních scénářích v Javě.
Některé scénáře jsou následující:
- Metoda vyvolána pomocí objektu null.
- Přístup nebo úprava pole nebo datového člena objektu null.
- Předání objektu null jako argumentu metodě.
- Výpočet délky nulového pole.
- Přístup k indexu nulového pole.
- Synchronizace nulového objektu.
- Házení nulového objektu.
Výjimka ukazatele Null sahá od třídy RuntimeException.
Hierarchie NullPointerException je uvedena níže.
Jak je znázorněno ve výše uvedené hierarchii, Null Pointer Exception se rozšiřuje z RuntimeException, která dědí Exception Class. Třída výjimek je zase odvozena od třídy Throwable, která je podtřídou Object.
Příčiny výskytu java.lang.NullPointerException
Nyní si ukážeme každý ze scénářů výskytu NullPointerException, který jsme uvedli výše.
# 1) Metoda je vyvolána pomocí objektu null
Zvažte následující příklad kódu. Tady máme třídu MyClass, která poskytuje dvě metody. První metoda ‚initT 'vrací prázdný objekt. V hlavní metodě vytvoříme objekt MyClass s voláním metody initT.
Dále voláme tiskovou metodu MyClass. Zde je vyvolána java.lang.NullPointerException, protože voláme tiskovou metodu pomocí 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ýstup
# 2) Přístupové pole nulového 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ýstup
jak otevřít torrentované soubory ve Windows 10
Toto je další příčina NullPointerException. Zde se pokusíme o přístup k členovi třídy pomocí objektu null. Objektu t přiřadíme návratovou hodnotu metody initT a poté přistoupíme k objektu numField pomocí objektu t. Ale objekt t je nulový objekt, protože initT vrací nulový objekt. V tomto okamžiku je vyvolána java.lang.NullPointerException.
# 3) Předání nulového objektu jako argumentu
Toto je běžná příčina výskytu java.lang.NullPointerException. Zvažte následující program Java. Zde máme metodu ‚print_LowerCase ', která převádí objekt String předaný jako argument na malá písmena.
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ýstup
V hlavní metodě voláme tuto metodu a předáváme null jako argument. Protože String objekt nemůže mít hodnotu null, je vyvolána java.lang.NullPointerException.
# 4) Získání délky nulového pole
Pokus o výpočet délky pole null má také za následek vyvolání java.lang.NullPointerException.
Níže uvedený program to ukazuje.
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ýstup
Ve výše uvedeném programu deklarujeme pole a přiřadíme mu null, tj. Žádná data. Když na tomto nulovém poli použijeme vlastnost délky, je vyvolána NullPointerException.
# 5) Přístupový index nulového pole
Podobně jako délka, i když se pokusíme získat přístup k hodnotě v nulovém poli pomocí indexu, je to příč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ýstup
Ve výše uvedeném programu se pokusíme získat přístup k hodnotě nulového pole v indexu 2.
# 6) Synchronizace na nulovém objektu
Obvykle synchronizujeme blok nebo metodu, abychom usnadnili souběžný přístup. Odkaz na objekt, který používáme pro synchronizaci, by však neměl mít hodnotu null. Pokud se jedná o nulový objekt, vede k java.lang.NullPointerException.
Níže uvedený program Java to ukazuje. Jak vidíme, máme objekt String „mutex“ inicializovaný na null. Pak v hlavní funkci použijeme synchronizovaný blok s mutexem jako odkaz na objekt. Protože mutex je null, je vyvolána 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ýstup
# 7) Házením null
public class Main { public static void main(String() args) { throw null; //throw null } }
Výstup:
Ve výše uvedeném ukázkovém programu je místo vyvolání platného objektu vyvolána hodnota null. To má za následek výjimku Null Pointer.
Vyhněte se výjimce nulového ukazatele
Nyní, když jsme viděli příčiny výskytu NullPointerException, musíme se také pokusit tomu v našem programu vyhnout.
Nejprve musíme zajistit, aby objekty, které používáme v našich programech, byly správně inicializovány, abychom se mohli vyhnout použití nulových objektů, které vedou k výjimce nulového ukazatele. Měli bychom se také postarat o to, aby referenční proměnné použité v programu směřovaly k platným hodnotám a náhodou nezískaly nulové hodnoty.
Kromě těchto úvah můžeme také postupovat opatrněji případ od případu, abychom se vyhnuli java.lang.NullPointerException.
Níže uvažujeme několik případů.
# 1) Porovnání řetězců s literály
Porovnání řetězcové proměnné a literálu (skutečná hodnota nebo prvek výčtu) je v programech Java velmi běžná operace. Ale pokud proměnná String, která je objektem, má hodnotu null, pak porovnání tohoto objektu null s literály vyvolá NullPointerException.
Takže řešením je vyvolat metodu porovnání z literálu namísto objektu String, který může mít hodnotu null.
Následující program ukazuje, jak můžeme vyvolat metody porovnání z literálů a vyhnout se 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ýstup
# 2) Udržujte kontrolu argumentů metody
Zkontrolujte argumenty metody, abyste se ujistili, že nejsou nulovými hodnotami. Pokud argumenty neodpovídají specifikaci, pak kód vyvolá IllegalArgumentException k označení, že argumenty nejsou podle očekávání.
To je zobrazeno v níže uvedeném programu 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ýstup
# 3) Použití Ternary Operator k péči o nulové hodnoty
Můžeme použít ternární operátor, abychom se vyhnuli java.lang.NullPointerException. Ternární operátor má tři operátory. První je logický výraz, který je vyhodnocen jako true nebo false. Pokud je výraz pravdivý, vrátí se druhý operátor nebo se vrátí třetí operátor.
Následující program ukazuje použití ternárního operátoru, aby se 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ýstup
Často kladené otázky
Otázka č. 1) Jak mohu opravit NullPointerException v Javě?
Odpovědět: Musíme zajistit, aby všechny objekty použité v programu byly správně inicializovány a neměly nulové hodnoty. Referenční proměnné by také neměly mít nulové hodnoty.
# 2) Je NullPointerException zaškrtnuto nebo nezaškrtnuto?
Odpovědět: NullPointerException není zaškrtnutá výjimka. Jedná se o potomka RuntimeException a není zaškrtnuto.
# 3) Jak zastavím NullPointerException?
Odpovědět: Některé z osvědčených postupů, jak se vyhnout NullPointerException, jsou:
- Použijte metodu equals () a equalsIgnoreCase () s řetězcovým literálem namísto použití na neznámý objekt, který může mít hodnotu null.
- Použijte valueOf () místo toString (); a oba vrátí stejný výsledek.
- Použijte anotaci Java @NotNull a @Nullable.
# 4) Jaká je nulová hodnota v Javě?
Odpovědět: Hodnota null neodkazuje na žádný objekt nebo proměnnou. Je to klíčové slovo a literál. Představuje nulový odkaz.
# 5) Můžeme chytit NullPointerException v Javě?
Odpovědět: Výjimka java.lang.NullPointerException je nekontrolovaná výjimka a rozšiřuje třídu RuntimeException. Programátor tedy není nucen to chytit.
Závěr
V tomto kurzu jsme probrali NullPointerException v Javě. To je docela nebezpečná výjimka a obvykle se může objevit, když to nejméně očekáváme. Výjimka nulového ukazatele se většinou vyskytuje z důvodu nulového objektu nebo nulové reference. Už jsme viděli příčiny a způsoby, jak se vyhnout NullPointerException.
Pokud je to možné, programátor by se měl pokusit vyhnout se výskytu Null Pointer Exception v programu. Jelikož se jedná o nekontrolovanou runtime výjimku, měli bychom vidět, že k ní nedochází, když je aplikace spuštěna.
=> Navštivte zde a dozvíte se Java od začátku.
Doporučené čtení
- Výjimky Java a zpracování výjimek s příklady
- Jak zacházet s ArrayIndexOutOfBoundsException v Javě?
- Výukový program pro zpracování výjimek C # s příklady kódu
- Kompletní průvodce zpracováním výjimek PL SQL s příklady
- Jak zpracovat výjimku v SoapUI Groovy skriptech - SoapUI Tutorial # 11
- Python Try Except - Python Handling Exception With examples
- Zpracování výjimek JDBC - Jak zacházet s výjimkami SQL
- Zpracování výjimek v C ++