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 tipaiJava
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:
Javaimport 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ėjeJava
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žiusJava
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:
Javaimport 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:
Javaimport 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.