logo

Nulinės rodyklės išimtis Java

Šiame vadove mes išmoksime „Java“ nulinės žymeklio išimtį. Nulinės rodyklės išimtis yra vykdymo laiko išimtis. Null yra speciali reikšmė, kurią galima priskirti objekto nuorodai. Kai bandoma naudoti nuorodą, kurios reikšmė Null, pakeliama NullPointerException.

Skirtingi nulinės rodyklės išimties scenarijai

Atkreipkite dėmesį į kai kuriuos iš toliau pateiktų scenarijų, kai gali būti iškelta NullPointerException.

  • Nulinės reikšmės dydžio arba ilgio apskaičiavimas taip, lyg tai būtų elementų masyvas.

Failo pavadinimas: ThrowNullExcep.java

 public class ThrowNullExcep { // main method public static void main(String args[]) { int arr[] = null; // array is assigned a null value System.out.println('The length of the array arr is: ' + arr.length); } } 

Išvestis:

Išimtis gijoje „main“ java.lang.NullPointerException: negalima nuskaityti masyvo ilgio, nes „ThrowNullExcep.main(ThrowNullExcep.java:7“) yra nulis.
  • Metodo iškvietimas naudojant objektą, kurio reikšmė Null.

Failo pavadinimas: ThrowNullExcep1.java

 public class ThrowNullExcep1 { public void foo() { System.out.println('In the method foo.'); } public static void main(String args[]) { ThrowNullExcep1 obj = null; // assigning null value // invoking the method foo() obj.foo(); } } 

Išvestis:

 Exception in thread 'main' java.lang.NullPointerException: Cannot invoke 'ThrowNullExcep1.foo()' because '' is null at ThrowNullExcep1.main(ThrowNullExcep1.java:13) 
  • Kai bandote sinchronizuoti per NULL objektą.

Failo pavadinimas: ThrowNullExcep2.java

javascript visuotinis kintamasis
 // A Java program that synchronizes over a NULL object. import java.util.*; import java.io.*; // A Class that is required for sending the message class Sendr { public void sendMethod(String mssg) { System.out.println('Sending message: ' + mssg ); try { Thread.sleep(100); } catch (Exception exp) { System.out.println('Thread interrupted.' + exp); } System.out.println('
' + mssg + ' is sent'); } } // A Class that is used to send messages with the help of threads Threads class ThreadSend extends Thread { private String mssg; Sendr sendr; // Received a messge obj and the string // mssge that has to be sent ThreadSend(String mStr, Sendr obj) { mssg = mStr; sendr = obj; } public void run() { // Only a single thread is allowed to send a message // at a time. synchronized(sendr) { // synchronizing the send object sendr.sendMethod(mssg); } } } // Driver class public class ThrowNullExcep2 { // main method public static void main(String args[]) { Sendr sendObj = null; ThreadSend Sth1 = new ThreadSend( ' Hello ' , sendObj ); ThreadSend Sth2 = new ThreadSend( ' Bye Bye ' , sendObj ); // Starting the two threads of the ThreadedSend type Sth1.start(); Sth2.start(); // waiting for the threads to end try { Sth1.join(); Sth2.join(); } catch(Exception exp) { System.out.println('Interrupted : ' + exp); } } } 

Išvestis:

 Exception in thread 'Thread-0' Exception in thread 'Thread-1' java.lang.NullPointerException: Cannot enter synchronized block because 'this.sendr' is null at ThreadSend.run(ThrowNullExcep2.java:42) java.lang.NullPointerException: Cannot enter synchronized block because 'this.sendr' is null at ThreadSend.run(ThrowNullExcep2.java:42) 
  • Užuot išmetęs vertę, metamas Null.

Failo pavadinimas: ThrowNullExcep3.java

 // Modifying or accessing the fields of the Null object. public class ThrowExcep3 { int a; // main method public static void main(String args[]) { // assigning a null value ThrowExcep3 obj = null; obj.a = 3; } } 

Išvestis:

 Exception in thread 'main' java.lang.NullPointerException: Cannot assign field 'a' because '' is null at ThrowExcep3.main(ThrowExcep3.java:10) 

NULL reikšmės reikalavimas

Nulis yra speciali reikšmė, naudojama Java. Paprastai jis naudojamas parodyti, kad atskaitos kintamajam nėra priskirtos vertės. Nulinė reikšmė daugiausia naudojama diegiant duomenų struktūras, pvz., susietą sąrašą ar medį. Jis taip pat naudojamas Singleton modeliui.

Kaip pašalinti pirmąjį simbolį „Excel“.

Vengti NullPointerException

Norint išvengti NullPointerException, reikia užtikrinti, kad visi objektai būtų tinkamai inicijuoti prieš juos naudojant. Kai deklaruojamas atskaitos kintamasis, prieš naudojant pamatinę reikšmę norint pasiekti lauką ar metodą, reikia patikrinti, ar nuorodai nepriskirta nulinė reikšmė.

Atkreipkite dėmesį į šias dažniausiai pasitaikančias sprendimo problemas.

1 atvejis: Stygų palyginimas su pažodžiu

Viena iš įprastų problemų apima literalo palyginimą su eilutės kintamuoju. Literalas gali būti elementas iš Enum arba iš eilutės. Užuot iškvietę metodą iš nulinio objekto, apsvarstykite galimybę jį iškviesti naudodami literalą.

Failo pavadinimas: NullPntrExcption.java

 import java.io.*; public class NullPntrExcption { // main method public static void main (String[] args) { // Initializing a String variable with a null value String pntr = null; // Checking if pntr.equals null or works fine. try { // The following line of code will raise the NullPointerException // It is because the pntr is null if (pntr.equals('JTP')) { System.out.print('String are the same.'); } else { System.out.print('Strinng are not the same.'); } } catch(NullPointerException e) { System.out.print('NullPointerException has been caught.'); } } } 

Išvestis:

 NullPointerException has been caught. 

Dabar pažiūrėkime, kaip galima to išvengti.

kaip sujungti eilutes Java

Failo pavadinimas: NullPntrExcption1.java

 public class NullPntrExcption1 { // main method public static void main (String[] args) { // Initializing a String variable with a null value String pntr = null; // Checking if pntr.equals null or works fine. try { // Now, the following line of code will not raise the NullPointerException // It is because the string literal is invoking the equals() method if ('JTP'.equals(pntr)) { System.out.print('String are the same.'); } else { System.out.print('Strinng are not the same.'); } } catch(NullPointerException e) { System.out.print('NullPointerException has been caught.'); } } } 

Išvestis:

 NullPointerException has been caught. 

2 atvejis: Stebėkite metodo argumentus

Pirmiausia reikia patikrinti metodo argumentus dėl nulinių reikšmių ir tada tęsti metodo vykdymą. Priešingu atveju yra nemaža tikimybė, kad jis parodys IllegalArgumentException išimtį ir taip pat parodys iškvietimo metodą, kad jis neteisingas su argumentais, kurie buvo perduoti.

Failo pavadinimas: NullPntrExcption2.java

 // A program for demonstrating that one must // check the parameters are null or not before // using them. import java.io.*; public class NullPntrExcption2 { public static void main (String[] args) { // String st is an empty string and invoking method getLength() String st = ''; try { System.out.println(getLength(st)); } catch(IllegalArgumentException exp) { System.out.println('IllegalArgumentException has been caught.'); } // String s set to a value and invoking method getLength() st = 'JTP'; try { System.out.println(getLength(st)); } catch(IllegalArgumentException exp) { System.out.println('IllegalArgumentException has been caught.'); } // Setting st with a value null and invoking method getLength() st = null; try { System.out.println(getLength(st)); } catch(IllegalArgumentException exp) { System.out.println('IllegalArgumentException has been caught. ' + exp); } } // method taht computes the length of a string st. // It throws and IllegalArgumentException, if st is null public static int getLength(String st) { if (st == null) { throw new IllegalArgumentException('The argument can never be null.'); } return st.length(); } } 

Išvestis:

grazi kompiuterine kalba
 0 3 IllegalArgumentException has been caught. java.lang.IllegalArgumentException: The argument can never be null. 

3 atvejis: Trijų operatoriaus naudojimas

Taip pat galima naudoti trijų dalių operatorių, kad būtų išvengta NullPointerException. Trinare Bulio išraiška įvertinama pirmiausia. Jei išraiška įvertinta kaip tiesa, tada grąžinamas val1. Kitu atveju grąžinamas val2.

Failo pavadinimas: NullPntrExcption3.java

 // A program for demonstrating the fact that // NullPointerException can be avoided using the ternary operator. import java.io.*; public class NullPntrExcption3 { // main method public static void main (String[] args) { // Initializing String variable with null value String st = null; String mssge = (st == null) ? 'String is Null.' : st.substring(0, 5); System.out.println(mssge); // Initializing the String variable with string literal st = 'javaTpoint'; mssge = (st == null) ? '' : st.substring(0, 10); System.out.println(mssge); } } 

Išvestis:

 String is Null. javaTpoint