logo

Nulinės rodyklės išimtis Java

NullPointerException programoje Java yra RuntimeException. Tai atsitinka, kai programa bando naudoti objekto nuorodą, kurios reikšmė yra nul. Java „null“ yra speciali reikšmė, kurią galima priskirti objektų nuorodoms, nurodant, kad reikšmės nėra.

Nulinės rodyklės išimties priežastys

NullPointerException atsiranda dėl šių priežasčių: 

  • Metodo iškvietimas iš nulinio objekto.
  • Nulinio objekto lauko prieiga arba modifikavimas.
  • Nulinio ilgio ėmimas taip, lyg tai būtų masyvas.
  • Nulinių objektų lizdų prieiga arba keitimas taip, lyg tai būtų masyvas.
  • Metimas nulinis, tarsi tai būtų Metimo vertė.
  • Kai bandote sinchronizuoti per nulinį objektą.

Pavyzdys:



ciklo tipai
Java
public class Geeks {    public static void main(String[] args) {    // Reference set to null  String s = null;     System.out.println(s.length());   } } 

Išvestis:

Hangup (SIGHUP)  
Exception in thread 'main' java.lang.NullPointerException
at Geeks.main(Geeks.java:10)

Paaiškinimas: Šiame pavyzdyje eilutės nuoroda „s“ yra nulinė. Kai programa bando iškviesti long() metodą, ji išmeta NullPointerException, nes tikrojo objekto nėra.

stlc

Kodėl „Java“ naudojamas null?

Nulinė reikšmė naudojama kaip rezervuota vieta ir nurodo, kad nuorodos kintamajam nėra priskirta jokia reikšmė. Įprastos programos apima:

  • Susietos duomenų struktūros : reiškia sąrašo arba medžio šakos pabaigą.
  • Dizaino modeliai : Tai naudojama tokiuose modeliuose kaip Null Object Pattern arba Singleton Pattern.

Kaip išvengti NullPointerException

Norėdami išvengti NullPointerException, turime užtikrinti, kad visi objektai būtų tinkamai inicijuoti prieš juos naudodami. Kai deklaruojame nuorodos kintamąjį, prieš pateikdami užklausą dėl metodo arba lauko iš objektų, turime patikrinti, ar objektas nėra nulinis.

1. Styginių raidžių naudojimas lygyje ()

Labai dažna atvejo problema apima eilutės kintamojo ir literalo palyginimą. Literatūra gali būti eilutė arba Enum elementas. Užuot iškvietę metodą iš nulinio objekto, apsvarstykite galimybę jį iškviesti iš literalo. 

Pavyzdys:

Java
import java.io.*; class Geeks {  public static void main (String[] args) {    // Initializing String variable with null value  String s = null;  // Checking if s.equals null  try  {  // This line of code throws NullPointerException because s is null  if (s.equals('gfg'))  System.out.print('Same');  else   System.out.print('Not Same');  }  catch(NullPointerException e)  {  System.out.print('NullPointerException Caught');  }  } } 

Išvestis
NullPointerException Caught

Mes galime išvengti NullPointerException iškviesdami lygiavertį žodį, o ne objektą.

java int eilutėje
Java
import java.io.*; class Geeks {  public static void main (String[] args) {    // Initializing String variable with null value  String s = null;  // Checking if s is null using try catch  try  {  if ('gfg'.equals(s))  System.out.print('Same');  else   System.out.print('Not Same');   }  catch(NullPointerException e)  {  System.out.print('Caught NullPointerException');  }  } } 

Išvestis
Not Same

Pastaba : Visada iškvieskite lygybę literale, kad išvengtumėte metodo iškvietimo ant nulinės nuorodos.

2. Tikrinimo metodo argumentai

Prieš vykdydami naujojo metodo turinį, pirmiausia turėtume patikrinti jo argumentus, ar nėra niekinių reikšmių, ir tęsti metodo vykdymą tik tada, kai argumentai yra tinkamai patikrinti. Priešingu atveju jis išmes IllegalArgumentException ir praneš iškvietimo metodui, kad kažkas negerai su perduodamais argumentais. 

Pavyzdys:

Sara Ali Khan amžius
Java
import java.io.*; class Geeks {  public static void main(String[] args) {    // String s set an empty string and calling getLength()  String s = '';    try {  System.out.println(getLength(s));  }  catch (IllegalArgumentException e) {  System.out.println(  'IllegalArgumentException caught');  }  // String s set to a value and calling getLength()  s = 'GeeksforGeeks';    try {  System.out.println(getLength(s));  }  catch (IllegalArgumentException e) {  System.out.println(  'IllegalArgumentException caught');  }  // Setting s as null and calling getLength()  s = null;    try {  System.out.println(getLength(s));  }  catch (IllegalArgumentException e) {  System.out.println(  'IllegalArgumentException caught');  }  }  public static int getLength(String s)  {  if (s == null)  throw new IllegalArgumentException(  'The argument cannot be null');    return s.length();  } } 

Išvestis
0 13 IllegalArgumentException caught 

3. Naudokite „Tternary Operator“.

Trinaris operatorius gali būti naudojamas norint išvengti NullPointerException. Pirmiausia įvertinama Būlio išraiška. Jei išraiška teisinga, grąžinama reikšmė1, priešingu atveju grąžinama reikšmė2. Nulinėms rodyklėms tvarkyti galime naudoti trijų dalių operatorių.

Pavyzdys:

Java
import java.io.*; class Geeks {  public static void main(String[] args)  {  String s = null;  String m = (s == null) ? '' : s.substring(0 5);  System.out.println(m);  s = 'Geeksforgeeks';  m = (s == null) ? '' : s.substring(0 5);  System.out.println(m);  } } 

Išvestis
Geeks 

Paaiškinimas : trijų dalių operatorius padeda patikrinti, ar nėra nulio, ir išvengti operacijų su nulinėmis nuorodomis.

4. Pasirenkamos klasės naudojimas („Java 8+“)

Java 8 Neprivaloma klasė buvo pristatyta kaip konteinerio objektas, kuriame gali būti arba negali būti nulio reikšmės. Tai padeda išvengti NullPointerException verčiant aiškiai tvarkyti atvejį, kai reikšmės nėra.

Pavyzdys:

Java
import java.util.Optional; public class OptionalExample {  public static void main(String[] args) {  Optional<String> name = Optional.ofNullable(null);  // Safe way to access  System.out.println(name.orElse('Default Name')); // prints: Default Name  } } 

Išvestis
Default Name 

Paaiškinimas: Optional.ofNullable(value) apvynioja reikšmę, kuri gali būti nulinė. arbaElse() suteikia atsarginį variantą, jei reikšmės nėra.