Una NullPointerException a Java és una RuntimeException. Es produeix quan un programa intenta utilitzar una referència d'objecte que té el valor nul. A Java, "nul" és un valor especial que es pot assignar a les referències d'objectes per indicar l'absència d'un valor.
Motius de l'excepció del punter nul
Una NullPointerException es produeix pels motius següents:
- Invocació d'un mètode des d'un objecte nul.
- Accés o modificació del camp d'un objecte nul.
- Prenent la longitud de null com si fos una matriu.
- Accedir o modificar les ranures d'objectes nuls com si fos una matriu.
- Llançar null com si fos un valor Throwable.
- Quan intenteu sincronitzar sobre un objecte nul.
Exemple:
any inventat per ordinadorJava
public class Geeks { public static void main(String[] args) { // Reference set to null String s = null; System.out.println(s.length()); } }
Sortida:
Hangup (SIGHUP)
Exception in thread 'main' java.lang.NullPointerException
at Geeks.main(Geeks.java:10)
Explicació: En aquest exemple, la referència de cadena 's' és nul·la. Quan el programa intenta cridar el mètode length() llança una NullPointerException perquè no hi ha cap objecte real.
components del robot
Per què s'utilitza null a Java?
El valor nul serveix com a marcador de posició i indica que no s'assigna cap valor a una variable de referència. Les aplicacions habituals inclouen:
- Estructures de dades enllaçades : representa el final d'una llista o branca d'arbre.
- Patrons de disseny : S'utilitza en patrons com el patró d'objecte nul o el patró Singleton.
Com evitar NullPointerException
Per evitar la NullPointerException ens hem d'assegurar que tots els objectes s'inicialitzin correctament abans d'utilitzar-los. Quan declarem una variable de referència hem de verificar que l'objecte no és nul abans de demanar un mètode o un camp als objectes.
1. Utilitzar literals de cadena en equals()
Un problema de cas molt comú implica la comparació entre una variable String i un literal. El literal pot ser una cadena o un element d'una enumeració. En lloc d'invocar el mètode des de l'objecte nul, considereu invocar-lo des del literal.
Exemple:
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'); } } }
Sortida
NullPointerException Caught
Podem evitar NullPointerException cridant a equals en literal en lloc d'objecte.
Javaimport 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'); } } }
Sortida
Not Same
Nota : invoqueu sempre iguals al literal per evitar cridar un mètode en una referència nul·la.
2. Comprovació dels arguments del mètode
Abans d'executar el cos del nou mètode, primer hauríem de comprovar els seus arguments per als valors nuls i continuar amb l'execució del mètode només quan els arguments estiguin correctament comprovats. En cas contrari, llançarà una IllegalArgumentException i notificarà al mètode de crida que hi ha alguna cosa malament amb els arguments passats.
abstracció en java
Exemple:
comentari cssJava
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(); } }
Sortida
0 13 IllegalArgumentException caught
3. Utilitzeu l'operador ternari
L'operador ternari es pot utilitzar per evitar NullPointerException. Primer s'avalua l'expressió booleana. Si l'expressió és certa, es retorna el valor1, en cas contrari es retorna el valor2. Podem utilitzar l'operador ternari per manejar punters nuls.
Exemple:
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); } }
Sortida
Geeks
Explicació : l'operador ternari ajuda a comprovar si hi ha nul·les i a evitar operacions sobre referències nul·les.
4. Ús de la classe opcional (Java 8+)
A Java 8, la classe opcional es va introduir com un objecte contenidor que pot contenir o no un valor no nul. Ajuda a evitar NullPointerException forçant a gestionar explícitament el cas quan no hi ha un valor.
Exemple:
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 } }
Sortida
Default Name
Explicació: Optional.ofNullable(valor) embolcalla el valor que pot ser nul. o Else() proporciona una alternativa si el valor no està present.