what is nullpointerexception java how avoid it
Denna handledning kommer att förklara allt om NullPointerException i Java. Vi kommer att diskutera orsakerna till Null Pointer Exception och sätt att undvika det:
NullPointerException i Java är ett undantag för runtime. Java tilldelar en objektreferens ett speciellt nullvärde. När ett program försöker använda en objektreferens till null-värdet kastas detta undantag.
=> Se upp den enkla Java-träningsserien här.
Vad du kommer att lära dig:
NullPointerException i Java
Om en objektreferens med nullvärde kastar NullPointerException, varför behöver vi då ett nullvärde?
Nollvärdet används vanligtvis för att indikera att inget värde har tilldelats en referensvariabel. För det andra behöver vi nollvärden för samlingar som länkade listor och träd för att indikera nollnoder. Designmönstren som singletonmönster använder nollvärden.
Avslutningsvis har nullvärdet i Java många användningsområden. Null Pointer Exception kastas i specifika scenarier i Java.
Några av scenarierna är som följer:
- Metoden åberopas med ett null-objekt.
- Åtkomst till eller ändring av ett fält eller en datamedlem i null-objektet.
- Skicka ett null-objekt som ett argument till en metod.
- Beräknar längden på en null-array.
- Åtkomst till index för en null array.
- Synkroniserar ett null-objekt.
- Kasta ett null-objekt.
Null Pointer Exception sträcker sig från klassen RuntimeException.
Hierarkin för NullPointerException ges nedan.
Som visas i ovanstående hierarki sträcker sig Null Pointer Exception från RuntimeException som ärver Exception Class. Undantagsklassen härleds i sin tur från Throwable-klassen som är en underklass av Object.
Orsaker till java.lang.NullPointerException Förekomst
Nu kommer vi att demonstrera vart och ett av scenarierna för NullPointerException-förekomsten som vi listade ovan.
# 1) Metoden åberopas med ett null-objekt
Tänk på följande kodexempel. Här har vi en klass, MyClass, som ger två metoder. Den första metoden 'initT' returnerar ett null-objekt. I huvudmetoden skapar vi ett objekt av MyClass med ett anrop till initT-metoden.
Därefter kallar vi utskriftsmetoden för MyClass. Här kastas java.lang.NullPointerException när vi kallar utskriftsmetoden med ett 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) Åtkomstfält för ett 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
vänster koppling vs vänster yttre koppling
Detta är en annan orsak till NullPointerException. Här försöker vi komma åt en klassmedlem med ett null-objekt. Vi tilldelar returvärdet för initT-metoden till objektet t och får sedan åtkomst till numField med objektet t. Men objektet t är ett null-objekt eftersom initT returnerar ett null-objekt. Vid denna tidpunkt höjs java.lang.NullPointerException.
# 3) Skicka ett null-objekt som ett argument
Detta är den vanligaste orsaken till java.lang.NullPointerException-förekomst. Tänk på följande Java-program. Här har vi en metod 'print_LowerCase' som konverterar strängobjektet som skickats som ett argument till gemener.
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 huvudmetoden kallar vi den här metoden och skickar en null som ett argument. Eftersom String-objektet inte kan vara null kastas java.lang.NullPointerException.
# 4) Få längden på en null array
Att försöka beräkna längden på en null-array resulterar också i att java.lang.NullPointerException kastas.
Nedanstående program visar detta.
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 ovanstående program förklarar vi en matris och tilldelar den noll, dvs. inga data. När vi använder längdegenskapen på den här nollmatrisen kastas NullPointerException.
# 5) Åtkomstindex för en null-array
Liknande längd, även om vi försöker komma åt ett värde i en null-array med hjälp av ett index, är det orsaken till 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 ovanstående program försöker vi komma åt värdet vid index 2 för en null-array.
# 6) Synkronisering på ett null-objekt
Vi synkroniserar vanligtvis ett block eller en metod för att underlätta samtidig åtkomst. Objektreferensen som vi använder för synkronisering bör dock inte vara noll. Om det är ett null-objekt resulterar det i java.lang.NullPointerException.
Nedanstående Java-program visar detta. Som vi kan se har vi ett String-objekt 'mutex' initialiserat till null. Sedan i huvudfunktionen använder vi ett synkroniserat block med mutex som objektreferens. Eftersom mutex är null java.lang.NullPointerException höjs.
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) Genom att kasta null
public class Main { public static void main(String() args) { throw null; //throw null } }
Produktion:
I ovanstående exempelprogram kastas null i stället för att kasta ett giltigt objekt. Detta resulterar i Null Pointer Exception.
Undvik nollpekareundantag
Nu när vi har sett orsakerna till förekomsten av NullPointerException, måste vi också försöka undvika det i vårt program.
Först måste vi se till att objekten som vi använder i våra program initialiseras ordentligt så att vi kan undvika att använda nollobjekt som resulterar i Null Pointer Exception. Vi bör också se till att referensvariablerna som används i programmet pekar på giltiga värden och inte av misstag förvärvar nollvärden.
Förutom dessa överväganden kan vi också vara mer försiktiga från fall till fall för att undvika java.lang.NullPointerException.
Nedan följer några fall.
# 1) Strängjämförelse med bokstäver
En jämförelse mellan strängvariabeln och en bokstavlig (verkligt värde eller element i enum) är en mycket vanlig operation i Java-program. Men om strängvariabeln som är ett objekt är noll, så jämför NullPointerException att jämföra detta nollobjekt med bokstäver.
Så lösningen är att åberopa jämförelsemetoden från det bokstavliga i stället för strängobjektet som kan vara noll.
Följande program visar hur vi kan åberopa jämförelsemetoder från bokstäver och undvika 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) Håll koll på argumenten för en metod
Kontrollera metodens argument för att säkerställa att de inte är null-värden. Om argumenten inte är enligt specifikationen kommer koden att kasta IllegalArgumentException för att indikera att argumenten inte är som förväntat.
Detta visas i Java-programmet nedan.
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) Användning av Ternary Operator för att ta hand om nollvärden
Vi kan använda den ternära operatören för att undvika java.lang.NullPointerException. Den ternära operatören har tre operatörer. Det första är ett booleskt uttryck som utvärderas till sant eller falskt. Om uttrycket är sant returneras den andra operatören eller den tredje operatören.
Följande program visar användningen av en ternär operatör för att undvika 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
Vanliga frågor
F # 1) Hur fixar jag NullPointerException i Java?
Svar: Vi måste se till att alla objekt som används i programmet initialiseras ordentligt och att de inte har nollvärden. Referensvariablerna bör inte heller ha nollvärden.
# 2) Är NullPointerException markerad eller avmarkerad?
Svar: NullPointerException är inte ett markerat undantag. Det är en ättling till RuntimeException och är inte markerad.
# 3) Hur stoppar jag NullPointerException?
Svar: Några av de bästa metoderna för att undvika NullPointerException är:
- Använd lik () och jämställdIgnoreCase () -metoden med String bokstavlig istället för att använda den på det okända objekt som kan vara noll.
- Använd valueOf () istället för toString (); och båda ger samma resultat.
- Använd Java-anteckningen @NotNull och @Nullable.
# 4) Vad är nollvärdet i Java?
Svar: Ett nollvärde hänvisar inte till något objekt eller variabel. Det är ett nyckelord och en bokstavlig. Det representerar en nollreferens.
# 5) Kan vi fånga NullPointerException i Java?
Svar: Undantaget java.lang.NullPointerException är ett okontrollerat undantag och utökar RuntimeException-klassen. Därför finns det ingen tvång för programmeraren att fånga den.
Slutsats
I denna handledning har vi diskuterat NullPointerException i Java. Detta är ett ganska farligt undantag och kan vanligtvis dyka upp när vi minst förväntar oss det. Null Pointer Exception förekommer oftast på grund av null-objektet eller null-referensen. Vi har redan sett orsakerna och sätten att undvika NullPointerException.
Så långt det är möjligt bör programmeraren försöka undvika förekomsten av Null Pointer Exception i ett program. Eftersom detta är ett okontrollerat runtime-undantag bör vi se att det inte inträffar när programmet körs.
=> Besök här för att lära dig Java från Scratch.
Rekommenderad läsning
- Java-undantag och undantagshantering med exempel
- Hur hanterar jag ArrayIndexOutOfBoundsException i Java?
- C # Exception Handling Tutorial med kodexempel
- Komplett guide till PL SQL-undantagshantering med exempel
- Hur man hanterar undantag i SoapUI Groovy Scripts - SoapUI-handledning # 11
- Python Prova utom - Python-hanteringsundantag med exempel
- JDBC Undantagshantering - Hur man hanterar SQL-undantag
- Undantagshantering i C ++