[Java] Perché String.valueOf (null) lancia una NullPointerException?



Answers

Il problema è che stai chiamando String.valueOf(char[]) e non String.valueOf(Object) .

La ragione di ciò è che Java sceglierà sempre la versione più specifica di un metodo sovraccarico che funziona con i parametri forniti. null è un valore valido per un parametro Object , ma è anche un valore valido per un parametro char[] .

Per fare in modo che Java usi la versione Object , passa in null tramite una variabile o specifica un cast esplicito su Oggetto:

Object o = null;
System.out.println("String.valueOf(null) = " + String.valueOf(o));
// or
System.out.println("String.valueOf(null) = " + String.valueOf((Object) null));
Question

secondo la documentazione, il metodo String.valueOf(Object obj) restituisce:

se l'argomento è null , allora una stringa uguale a "null" ; in caso contrario, viene restituito il valore di obj.toString() .

Ma come mai quando provo a fare questo:

System.out.println("String.valueOf(null) = " + String.valueOf(null));

getta invece NPE? (provalo tu stesso se non ci credi!)

    Exception in thread "main" java.lang.NullPointerException
    at java.lang.String.(Unknown Source)
    at java.lang.String.valueOf(Unknown Source)

Come mai sta succedendo? La documentazione mi sta mentendo? Si tratta di un bug importante in Java?




Se si osservano i metodi javadoc per i metodi String.valueOf() , si vedrà che in realtà indica se si passa un valore nullo al metodo attraverso NullPointerException . Inoltre, se il tuo IDE lo farà, puoi guardare il codice sorgente per quei metodi e vedrai che esiste un codice acually che mira specificatamente al possibile che l'input sia nullo e lancia una NullPointerException .




Links