what is nullpointerexception java how avoid it
Denne vejledning forklarer alt om NullPointerException i Java. Vi vil diskutere årsagerne til Null Pointer Exception og måder at undgå det på:
NullPointerException i Java er en runtime-undtagelse. Java tildeler en særlig nulværdi til en objektreference. Når et program forsøger at bruge en objektreference sat til nulværdien, kastes denne undtagelse.
=> Pas på den enkle Java-træningsserie her.
Hvad du lærer:
NullPointerException i Java
Hvis en objektreference med nulværdi kaster NullPointerException, hvorfor har vi så brug for en nulværdi?
Nulværdien bruges normalt til at angive, at der ikke er tildelt nogen værdi til en referencevariabel. For det andet har vi brug for nulværdier til samlinger som sammenkædede lister og træer for at angive nul-noder. Designmønstrene som singleton-mønstre gør brug af nulværdier.
Afslutningsvis har nulværdien i Java mange anvendelser. Null Pointer Exception kastes i specifikke scenarier i Java.
Nogle af scenarierne er som følger:
- Metode påberåbt ved hjælp af et null-objekt.
- Adgang til eller ændring af et felt eller datamedlem til null-objektet.
- At videregive nul objekt som et argument til en metode.
- Beregner længden af et null array.
- Adgang til indeks for et null array.
- Synkronisering af et null-objekt.
- Kaste et nul objekt.
Null Pointer Exception strækker sig fra klassen RuntimeException.
Hierarkiet af NullPointerException er angivet nedenfor.
Som vist i ovenstående hierarki strækker Null Pointer Exception sig fra RuntimeException, der arver Exception Class. Undtagelsesklassen til gengæld er afledt af Throwable-klassen, der er en underklasse af objektet.
Årsager til java.lang.NullPointerException Forekomst
Nu vil vi demonstrere hvert af de scenarier for NullPointerException-forekomst, som vi nævnte ovenfor.
# 1) Metoden påberåbes ved hjælp af et null-objekt
Overvej følgende kodeeksempel. Her har vi en klasse, MyClass, der giver to metoder. Den første metode 'initT' returnerer et null-objekt. I hovedmetoden opretter vi et objekt af MyClass med et opkald til initT-metoden.
Dernæst kalder vi udskrivningsmetoden til MyClass. Her kastes java.lang.NullPointerException, når vi kalder udskrivningsmetoden ved hjælp af et null-objekt.
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 } }
Produktion
# 2) Adgangsfelt for et null-objekt
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 } }
Produktion
hvad er den bedste fjernelse af malware
Dette er en anden årsag til NullPointerException. Her forsøger vi at få adgang til et klassemedlem ved hjælp af et null-objekt. Vi tildeler returværdien af initT-metoden til objektet t og får derefter adgang til numField ved hjælp af objekt t. Men objektet t er et null-objekt, da initT returnerer et null-objekt. På dette tidspunkt hæves java.lang.NullPointerException.
# 3) At sende et null-objekt som et argument
Dette er den almindelige årsag til forekomst af java.lang.NullPointerException. Overvej følgende Java-program. Her har vi en metode 'print_LowerCase', der konverterer strengobjektet, der er sendt som et argument, til små bogstaver.
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 } }
Produktion
I hovedmetoden kalder vi denne metode og sender en null som et argument. Da strengobjektet ikke kan være null, kastes java.lang.NullPointerException.
# 4) Få længden af et null array
Forsøg på at beregne længden af et null-array resulterer også i, at java.lang.NullPointerException kastes.
Nedenstående program viser dette.
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 } }
Produktion
I ovenstående program erklærer vi et array og tildeler det null, dvs. ingen data. Når vi bruger længdeegenskaber på dette null-array, kastes NullPointerException.
# 5) Adgangsindeks for et null-array
Svarende til længde, selvom vi forsøger at få adgang til en værdi i et null-array ved hjælp af et indeks, er det årsagen til 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)); } }
Produktion
I ovenstående program forsøger vi at få adgang til værdien ved indeks 2 i et null-array.
# 6) Synkronisering på et null-objekt
Vi synkroniserer normalt en blok eller en metode for at lette samtidig adgang. Objektreferencen, som vi bruger til synkronisering, bør dog ikke være nul. Hvis det er et null-objekt, resulterer det i java.lang.NullPointerException.
Nedenstående Java-program demonstrerer dette. Som vi kan se, har vi et strengobjekt 'mutex' initialiseret til null. Så i hovedfunktionen bruger vi en synkroniseret blok med mutex som objektreference. Da mutex er nul er java.lang.NullPointerException hævet.
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'); } } }
Produktion
# 7) Ved at kaste null
public class Main { public static void main(String() args) { throw null; //throw null } }
Produktion:
I ovenstående eksempelprogram kastes null i stedet for at smide et gyldigt objekt. Dette resulterer i Null Pointer Exception.
Undgår undtagelse fra nul pointer
Nu hvor vi har set årsagerne til forekomsten af NullPointerException, skal vi også forsøge at undgå det i vores program.
Først skal vi sikre, at de objekter, vi bruger i vores programmer, initialiseres korrekt, så vi kan undgå brugen af nul objekter, der resulterer i Null Pointer Exception. Vi skal også passe på, at de referencevariabler, der bruges i programmet, peger på gyldige værdier og ikke ved et uheld erhverver nulværdier.
Bortset fra disse overvejelser kan vi også være mere forsigtige fra sag til sag for at undgå java.lang.NullPointerException.
Nedenfor overvejer vi et par tilfælde.
# 1) Sammenligning af strenge med bogstaver
En sammenligning mellem strengvariablen og en bogstavelig (faktisk værdi eller element i enum) er en meget almindelig operation i Java-programmer. Men hvis den strengvariabel, der er et objekt, er nul, vil sammenligning af dette null-objekt med bogstaver kaste NullPointerException.
Så løsningen er at påberåbe sig sammenligningsmetoden fra den bogstavelige i stedet for String-objektet, der kan være null.
Følgende program viser, hvordan vi kan påberåbe sammenligningsmetoder fra bogstaver og undgå 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'); } } }
Produktion
# 2) Hold kontrol med argumenterne for en metode
Kontroller metodens argumenter for at sikre, at de ikke er nulværdier. Hvis argumenterne ikke er i henhold til specifikationen, kaster koden IllegalArgumentException for at indikere, at argumenterne ikke er som forventet.
Dette vises i nedenstående Java-program.
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(); } }
Produktion
# 3) Brug af Ternary Operator til at tage sig af nulværdier
Vi kan bruge den ternære operator for at undgå java.lang.NullPointerException. Den ternære operatør har tre operatører. Den første er et boolsk udtryk, der evalueres til sandt eller falsk. Hvis udtrykket er sandt, returneres den anden operator, eller den tredje operator returneres.
Følgende program viser brugen af en ternær operatør for at undgå 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); }
Produktion
Ofte stillede spørgsmål
Spørgsmål nr. 1) Hvordan løser jeg NullPointerException i Java?
Svar: Vi skal sikre, at alle objekter, der bruges i programmet, initialiseres korrekt, og at de ikke har nulværdier. Referencevariablerne bør heller ikke have nulværdier.
# 2) Er NullPointerException markeret eller ikke markeret?
Svar: NullPointerException er ikke en kontrolleret undtagelse. Det er en efterkommer af RuntimeException og er ikke markeret.
# 3) Hvordan stopper jeg NullPointerException?
Svar: Nogle af de bedste fremgangsmåder for at undgå NullPointerException er:
- Brug lig () og equalsIgnoreCase () -metoden med String-bogstav i stedet for at bruge den på det ukendte objekt, der kan være null.
- Brug valueOf () i stedet for toString (); og begge returnerer det samme resultat.
- Brug Java-kommentar @NotNull og @Nullable.
# 4) Hvad er nulværdien i Java?
Svar: En nulværdi henviser ikke til noget objekt eller en variabel. Det er et nøgleord og et bogstaveligt. Det repræsenterer en null reference.
# 5) Kan vi fange NullPointerException i Java?
Svar: Undtagelsen java.lang.NullPointerException er en ukontrolleret undtagelse og udvider RuntimeException-klassen. Derfor er der ingen tvang for programmøren at fange det.
Konklusion
I denne vejledning har vi diskuteret NullPointerException i Java. Dette er en ganske farlig undtagelse og kan normalt dukke op, når vi mindst venter det. Null Pointer Exception forekommer for det meste på grund af null-objektet eller null-reference. Vi har allerede set årsagerne og måderne til at undgå NullPointerException.
Programmøren skal så vidt muligt forsøge at undgå forekomsten af Null Pointer Exception i et program. Da dette er en ikke-markeret runtime-undtagelse, skal vi se, at den ikke forekommer, når applikationen kører.
=> Besøg her for at lære Java fra bunden.
Anbefalet læsning
- Java-undtagelser og undtagelseshåndtering med eksempler
- Sådan håndteres ArrayIndexOutOfBoundsException i Java?
- C # Exception Handling Tutorial med kodeeksempler
- Komplet guide til PL SQL undtagelseshåndtering med eksempler
- Sådan håndteres undtagelser i SoapUI Groovy Scripts - SoapUI Tutorial # 11
- Python Prøv undtagen - Pythonhåndteringsundtagelse med eksempler
- JDBC-undtagelseshåndtering - Sådan håndteres SQL-undtagelser
- Undtagelseshåndtering i C ++