what is nullpointerexception java how avoid it
Ta vadnica bo razložila vse o NullPointerException v Javi. Razpravljali bomo o vzrokih izjeme za ničelni kazalec in načinih, kako se temu izogniti:
NullPointerException v Javi je izjema med izvajanjem. Java referenci predmeta dodeli posebno vrednost nič. Ko program poskuša uporabiti referenco predmeta, nastavljeno na ničelno vrednost, se vrne ta izjema.
=> Tukaj bodite pozorni na preprosto serijo Java Training Training.
Kaj se boste naučili:
NullPointerException V Javi
Če referenca predmeta z ničelno vrednost vrže NullPointerException, zakaj potem potrebujemo ničelno vrednost?
Ničelna vrednost se običajno uporablja za označevanje, da referenčni spremenljivki ni bila dodeljena nobena vrednost. Drugič, za zbirke, kot so povezani seznami in drevesa, za označevanje ničelnih vozlišč potrebujemo ničelne vrednosti. Oblikovalski vzorci, kot so enojni vzorci, uporabljajo ničelne vrednosti.
Če zaključimo, ima ničelna vrednost v Javi več uporab. Null Pointer Exception je v nekaterih scenarijih v Javi vržen.
Nekateri scenariji so naslednji:
- Metoda, ki se prikliče z uporabo ničelnega predmeta.
- Dostop do ali spreminjanje polja ali podatkovnega člana ničelnega predmeta.
- Posredovanje ničelnega predmeta kot argumenta metodi.
- Izračun dolžine ničelne matrike.
- Dostop do indeksa ničelne matrike.
- Sinhronizacija ničelnega predmeta.
- Metanje ničelnega predmeta.
Izjema Null Pointer se razteza od razreda RuntimeException.
Hierarhija NullPointerException je podana spodaj.
Kot je prikazano v zgornji hierarhiji, se izjema Null Pointer širi od RuntimeException, ki podeduje razred izjem. Razred izjem pa izhaja iz razreda Throwable, ki je podrazred predmeta.
Vzroki za pojav java.lang.NullPointerException
Zdaj bomo prikazali vsak scenarij pojava NullPointerException, ki smo ga navedli zgoraj.
# 1) Metoda se prikliče z uporabo ničelnega predmeta
Upoštevajte naslednji primer kode. Tu imamo razred MyClass, ki ponuja dve metodi. Prva metoda 'initT' vrne ničelni objekt. V glavni metodi ustvarimo objekt MyClass s klicem metode initT.
Nato pokličemo metodo tiskanja MyClass. Tukaj se vrže java.lang.NullPointerException, ko s pomočjo ničelnega predmeta prikličemo metodo tiskanja.
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 } }
Izhod
# 2) Dostopno polje ničelnega predmeta
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 } }
Izhod
za vohunjenje drugega telefona
To je še en vzrok za NullPointerException. Tu poskušamo dostopati do člana razreda z uporabo ničelnega predmeta. Predmetu t dodelimo vrnjeno vrednost metode initT in nato s predmetom t dostopamo do numField. Toda objekt t je ničelni objekt, saj initT vrne ničelni objekt. Na tej točki je postavljen java.lang.NullPointerException.
# 3) Posredovanje ničelnega predmeta kot argumenta
To je pogost vzrok za pojav java.lang.NullPointerException. Razmislite o naslednjem programu Java. Tu imamo metodo 'print_LowerCase', ki pretvori objekt String, poslan kot argument, v male črke.
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 } }
Izhod
V glavni metodi pokličemo to metodo in kot argument posredujemo ničlo. Ker objekt String ne more biti ničen, se vrže java.lang.NullPointerException.
# 4) Pridobivanje dolžine ničelne matrike
Pri poskusu izračuna dolžine ničelne matrike se vrže tudi java.lang.NullPointerException.
Spodnji program to dokazuje.
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 } }
Izhod
V zgornjem programu deklariramo matriko in ji dodelimo nič, tj. Ni podatkov. Ko v tej ničelni matriki uporabimo lastnost dolžine, se vrže NullPointerException.
# 5) Dostopni indeks ničelne matrike
Podobno kot dolžina, tudi če poskušamo dostopati do vrednosti v ničelni matriki z uporabo indeksa, je to vzrok za 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)); } }
Izhod
V zgornjem programu poskušamo dostopati do vrednosti v indeksu 2 ničelne matrike.
# 6) Sinhronizacija na ničelnem objektu
Običajno sinhroniziramo blok ali metodo, da olajšamo sočasen dostop. Vendar sklic na objekt, ki ga uporabljamo za sinhronizacijo, ne sme biti nič. Če gre za ničelni objekt, potem prikaže java.lang.NullPointerException.
Spodnji program Java to dokazuje. Kot lahko vidimo, ima objekt String 'mutex' inicializiran na nič. Nato v glavni funkciji uporabimo sinhronizirani blok z muteksom kot referenco predmeta. Ker je mutex ničen, se dvigne 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'); } } }
Izhod
# 7) Z metanjem nič
public class Main { public static void main(String() args) { throw null; //throw null } }
Izhod:
V zgornjem primeru programa namesto metanja veljavnega predmeta vržemo null. Rezultat je izjema Null Pointer.
Izogibanje izjemi Null Kazalec
Zdaj, ko smo videli vzroke za pojav NullPointerException, se moramo temu v svojem programu tudi poskušati izogniti.
Najprej moramo zagotoviti, da se predmeti, ki jih uporabljamo v naših programih, pravilno inicializirajo, da se lahko izognemo uporabi ničelnih objektov, ki povzročijo izjemo Null Pointer. Prav tako moramo paziti, da so referenčne spremenljivke, uporabljene v programu, usmerjene na veljavne vrednosti in ne naključno pridobijo ničelnih vrednosti.
Poleg teh premislekov smo lahko tudi posebej previdni za vsak primer posebej, da se izognemo java.lang.NullPointerException.
Spodaj obravnavamo nekaj primerov.
# 1) Primerjava nizov s slovnicami
Primerjava spremenljivke niza in dobesednega izraza (dejanska vrednost ali element naštevanja) je zelo pogosta operacija v programih Java. Če pa je spremenljivka String, ki je objekt, nična, bo primerjava tega ničelnega predmeta s slovnicami vrgla NullPointerException.
Rešitev je torej v tem, da namesto predmeta String, ki je lahko nič, prikliče primerjalno metodo iz dobesednega besedila.
Naslednji program prikazuje, kako lahko uporabimo metode primerjave iz literalov in se izognemo 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'); } } }
Izhod
# 2) Preverite argumente metode
Preverite argumente metode in se prepričajte, da niso nič vrednosti. Če argumenti niso v skladu s specifikacijo, bo koda vrgla IllegalArgumentException, da označi, da argumenti niso v skladu s pričakovanji.
To je prikazano v spodnjem 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(); } }
Izhod
# 3) Uporaba Ternarnega operaterja za skrb za nične vrednosti
S ternarnim operatorjem se lahko izognemo java.lang.NullPointerException. Ternarni operater ima tri operaterje. Prvi je logični izraz, ki oceni na true ali false. Če je izraz resničen, se vrne drugi operater ali tretji operater.
Naslednji program prikazuje uporabo ternarnega operatorja, da bi se izognili 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); }
Izhod
Pogosto zastavljena vprašanja
V # 1) Kako popravim NullPointerException v Javi?
Odgovor: Zagotoviti moramo, da so vsi predmeti, uporabljeni v programu, pravilno inicializirani in nimajo ničelnih vrednosti. Prav tako referenčne spremenljivke ne smejo imeti ničelnih vrednosti.
# 2) Ali je NullPointerException označen ali ne?
Odgovor: NullPointerException ni preverjena izjema. Je potomec RuntimeException in ni potrjen.
# 3) Kako ustavim NullPointerException?
Odgovor: Nekaj najboljših praks za izogibanje NullPointerException je:
- Uporabite metodo equals () in equalsIgnoreCase () s Stralno dobesedno, namesto da jo uporabite na neznanem objektu, ki je lahko ničen.
- Uporabite valueOf () namesto toString (); in oba vrneta enak rezultat.
- Uporabite pripise Java @NotNull in @Nullable.
# 4) Kakšna je ničelna vrednost v Javi?
Odgovor: Ničelna vrednost se ne nanaša na noben objekt ali spremenljivko. Je ključna beseda in dobesedno besedilo. Predstavlja ničelno referenco.
# 5) Ali lahko ujamemo NullPointerException v Javi?
Odgovor: Izjema java.lang.NullPointerException je nepreverjena izjema in razširja razred RuntimeException. Zato programer ni prisiljen, da ga ujame.
Zaključek
V tej vadnici smo razpravljali o NullPointerException v Javi. To je precej nevarna izjema in se običajno lahko pojavi, ko to najmanj pričakujemo. Izjema Null Pointer se večinoma pojavi zaradi ničelnega predmeta ali ničelne reference. Vzroke in načine, kako se izogniti NullPointerException, smo že videli.
Kolikor je mogoče, se mora programer poskušati izogniti pojavu izjeme Null Pointer v programu. Ker gre za nepreverjeno izjemo med izvajanjem, bi morali videti, da do nje ne pride, ko se aplikacija izvaja.
=> Obiščite tukaj, če se želite naučiti Jave iz nič.
Priporočeno branje
- Java izjeme in obravnava izjem z primeri
- Kako ravnati z izjemo ArrayIndexOutOfBoundsException v Javi?
- Vadnica za ravnanje z izjemami C # s primeri kode
- Popoln vodnik za obravnavo izjem SQL PL z primeri
- Kako ravnati z izjemami v skriptih Groovy SoapUI - Vadnica SoapUI št. 11
- Python Try Except - Python obravnava izjemo s primeri
- Obravnava izjem JDBC - Kako ravnati z izjemami SQL
- Obravnava izjem v jeziku C ++