what is nullpointerexception java how avoid it
Denne opplæringen vil forklare alt om NullPointerException i Java. Vi vil diskutere årsakene til Null Pointer Exception og måter å unngå det på:
NullPointerException i Java er et runtime-unntak. Java tilordner en spesiell nullverdi til en objektreferanse. Når et program prøver å bruke en objektreferanse satt til nullverdien, kastes dette unntaket.
=> Se opp den enkle Java-treningsserien her.
Hva du vil lære:
NullPointerException I Java
Hvis en objektreferanse med nullverdi kaster NullPointerException, hvorfor trenger vi da en nullverdi?
Nullverdien brukes vanligvis til å indikere at ingen verdi er tilordnet en referansevariabel. For det andre trenger vi nullverdier for samlinger som koblede lister og trær for å indikere nullnoder. Designmønstrene som enkeltmønstre bruker nullverdier.
For å konkludere har nullverdien i Java mange bruksområder. Null Pointer Exception kastes i spesifikke scenarier i Java.
Noen av scenariene er som følger:
- Metode påkalt med et null-objekt.
- Tilgang til eller modifisering av et felt eller datamedlem til null-objektet.
- Overføring av null-objekt som argument til en metode.
- Beregner lengden på en null matrise.
- Tilgang til indeks for en null matrise.
- Synkroniserer et null-objekt.
- Kaster et nullobjekt.
Null Pointer Exception strekker seg fra klassen RuntimeException.
Hierarkiet til NullPointerException er gitt nedenfor.
Som vist i hierarkiet ovenfor strekker Null Pointer Exception seg fra RuntimeException som arver Exception Class. Unntaksklasse er i sin tur avledet fra Throwable-klassen som er en underklasse av Object.
Årsaker til java.lang.NullPointerException Occurrence
Nå skal vi demonstrere hvert av scenariene for NullPointerException-forekomsten som vi listet opp ovenfor.
# 1) Metoden påkalles ved hjelp av et null-objekt
Tenk på følgende kodeeksempel. Her har vi en klasse, MyClass som gir to metoder. Den første metoden ‘initT’ returnerer et null-objekt. I hovedmetoden lager vi et objekt av MyClass med et kall til initT-metoden.
Deretter kaller vi utskriftsmetoden til MyClass. Her kastes java.lang.NullPointerException mens vi kaller utskriftsmetoden ved hjelp av 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 } }
Produksjon
# 2) Tilgangsfelt 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 } }
Produksjon
binært søketre c ++ eksempel
Dette er en annen årsak til NullPointerException. Her prøver vi å få tilgang til et klassemedlem ved hjelp av et null-objekt. Vi tilordner returverdien til initT-metoden til objektet t og får deretter tilgang til numField ved hjelp av objektet t. Men objektet t er et nullobjekt ettersom initT returnerer et nullobjekt. På dette punktet heves java.lang.NullPointerException.
# 3) Å sende et nullobjekt som et argument
Dette er den vanlige årsaken til java.lang.NullPointerException-forekomst. Vurder følgende Java-program. Her har vi en metode ‘print_LowerCase’ som konverterer strengobjektet som er sendt som et argument til små bokstaver.
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 } }
Produksjon
I hovedmetoden kaller vi denne metoden og sender en null som et argument. Siden strengobjektet ikke kan være null, blir java.lang.NullPointerException kastet.
# 4) Få lengden på en null matrise
Forsøk på å beregne lengden på en null matrise resulterer også i at java.lang.NullPointerException blir kastet.
Programmet nedenfor 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 } }
Produksjon
I det ovennevnte programmet erklærer vi en matrise og tildeler null til den, dvs. ingen data. Når vi bruker lengdeegenskapen på denne nullmatrisen, kastes NullPointerException.
# 5) Tilgangsindeks for en null matrise
I likhet med lengden, selv om vi prøver å få tilgang til en verdi i en null matrise ved hjelp av en indeks, er det årsaken 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)); } }
Produksjon
I det ovennevnte programmet prøver vi å få tilgang til verdien ved indeks 2 til en null matrise.
# 6) Synkronisering på et null-objekt
Vi synkroniserer vanligvis en blokk eller en metode for å lette samtidig tilgang. Objektreferansen som vi bruker for synkronisering, skal imidlertid ikke være null. Hvis det er et nullobjekt, resulterer det i java.lang.NullPointerException.
Java-programmet nedenfor viser dette. Som vi kan se, har vi et strengobjekt ‘mutex’ initialisert til null. Så i hovedfunksjonen bruker vi en synkronisert blokk med mutex som objektreferanse. Som mutex er null java.lang.NullPointerException heves.
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'); } } }
Produksjon
# 7) Ved å kaste null
public class Main { public static void main(String() args) { throw null; //throw null } }
Produksjon:
I eksemplet ovenfor, kastes null i stedet for å kaste et gyldig objekt. Dette resulterer i Null Pointer Exception.
Unngå unntak fra Null Pointer
Nå som vi har sett årsakene til forekomsten av NullPointerException, må vi også prøve å unngå det i vårt program.
Først må vi sørge for at objektene vi bruker i programmene våre blir initialisert riktig slik at vi kan unngå bruk av nullobjekter som resulterer i Null Pointer Exception. Vi bør også passe på at referansevariablene som brukes i programmet, peker mot gyldige verdier og ikke ved et uhell skaffer nullverdier.
Bortsett fra disse hensynene, kan vi også utvise større forsiktighet i hvert enkelt tilfelle for å unngå java.lang.NullPointerException.
Nedenfor ser vi på noen få tilfeller.
# 1) Strengesammenligning med bokstaver
En sammenligning mellom strengvariabelen og en bokstavelig (faktisk verdi eller element i enum) er en veldig vanlig operasjon i Java-programmer. Men hvis strengvariabelen som er et objekt er null, vil sammenligning av dette nullobjektet med bokstaver kaste NullPointerException.
Så løsningen er å påkalle sammenligningsmetoden fra bokstavelig i stedet for strengobjektet som kan være null.
Det følgende programmet viser hvordan vi kan påberope meg sammenligningsmetoder fra bokstavene og unngå 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'); } } }
Produksjon
# 2) Hold kontroll på argumentene til en metode
Sjekk argumentene til metoden for å sikre at de ikke er nullverdier. Hvis argumentene ikke er i henhold til spesifikasjonen, vil koden kaste IllegalArgumentException for å indikere at argumentene ikke er som forventet.
Dette vises i Java-programmet nedenfor.
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(); } }
Produksjon
# 3) Bruk av Ternary Operator for å ta vare på nullverdier
Vi kan bruke den ternære operatøren for å unngå java.lang.NullPointerException. Den ternære operatøren har tre operatører. Den første er et boolsk uttrykk som evalueres til sant eller usant. Hvis uttrykket er sant, returneres den andre operatoren eller den tredje operatoren.
Følgende program viser bruken av en ternær operatør for å unngå 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); }
Produksjon
ofte stilte spørsmål
Sp # 1) Hvordan fikser jeg NullPointerException i Java?
Svar: Vi må sørge for at alle objektene som brukes i programmet, initialiseres riktig og at de ikke har nullverdier. Referansevariablene skal heller ikke ha nullverdier.
# 2) Er NullPointerException sjekket eller ikke merket av?
Svar: NullPointerException er ikke et merket unntak. Det er en etterkommer av RuntimeException og er ukontrollert.
# 3) Hvordan stopper jeg NullPointerException?
Svar: Noen av de beste metodene for å unngå NullPointerException er:
- Bruk lik () og equalsIgnoreCase () -metoden med String bokstavelig i stedet for å bruke den på det ukjente objektet som kan være null.
- Bruk valueOf () i stedet for toString (); og begge gir samme resultat.
- Bruk Java-merknad @NotNull og @Nullable.
# 4) Hva er nullverdien i Java?
Svar: En nullverdi refererer ikke til noe objekt eller variabel. Det er et nøkkelord og en bokstavelig. Det representerer en nullreferanse.
# 5) Kan vi fange NullPointerException i Java?
Svar: Unntaket java.lang.NullPointerException er et ukontrollert unntak og utvider RuntimeException-klassen. Derfor er det ingen tvang for programmereren å fange den.
Konklusjon
I denne opplæringen har vi diskutert NullPointerException i Java. Dette er et ganske farlig unntak og kan vanligvis dukke opp når vi minst forventer det. Null Pointer Exception forekommer hovedsakelig på grunn av null-objektet eller null-referansen. Vi har allerede sett årsakene og måtene å unngå NullPointerException.
Så langt det er mulig bør programmereren prøve å unngå forekomsten av Null Pointer Exception i et program. Siden dette er et ukjent unntak for kjøretid, bør vi se at det ikke oppstår når applikasjonen kjører.
=> Besøk her for å lære Java fra bunnen av.
Anbefalt lesing
- Java-unntak og unntakshåndtering med eksempler
- Hvordan håndtere ArrayIndexOutOfBoundsException i Java?
- C # Exception Handling Tutorial med kodeeksempler
- Komplett guide til PL SQL Unntakshåndtering med eksempler
- Hvordan håndtere unntak i SoapUI Groovy Scripts - SoapUI Tutorial # 11
- Python prøv unntatt - unntak fra Python-håndtering med eksempler
- JDBC Unntakshåndtering - Hvordan håndtere SQL-unntak
- Unntakshåndtering i C ++