Il problema è che il String.valueOf
metodo è sovraccarico :
Java Specification Language richiede che in questo tipo di casi venga scelto il sovraccarico più specifico :
Se più di un metodo membro è sia accessibile sia applicabile all'invocazione di un metodo, è necessario sceglierne uno per fornire il descrittore per l'invio del metodo di runtime. Il linguaggio di programmazione Java utilizza la regola che viene scelto il metodo più specifico .
A char[]
is-an Object
, ma non tutto Object
è-a char[]
. Pertanto, char[]
è più specifico di Object
, e come specificato dal linguaggio Java, String.valueOf(char[])
in questo caso viene scelto il sovraccarico.
String.valueOf(char[])
si aspetta che l'array non sia null
, e poiché null
in questo caso viene fornito, viene generato NullPointerException
.
La semplice "correzione" è di lanciare null
esplicitamente Object
come segue:
System.out.println(String.valueOf((Object) null));
// prints "null"
Domande correlate
Morale della storia
Ce ne sono alcuni importanti:
- Efficace Java 2nd Edition, Item 41: utilizzare l'overloading con giudizio
- Solo perché puoi sovraccaricare, non significa che dovresti sempre
- Possono causare confusione (specialmente se i metodi fanno cose molto diverse)
- Usando un buon IDE, puoi verificare quale sovraccarico è selezionato al momento della compilazione
- Con Eclipse, puoi passare con il mouse sull'espressione sopra e vedere che effettivamente
valueOf(char[])
è selezionato il sovraccarico!
- A volte vuoi esplicitamente trasmettere
null
(esempi da seguire)
Guarda anche
Al casting null
Esistono almeno due situazioni in cui null
è necessario eseguire il cast esplicito su un tipo di riferimento specifico:
- Per selezionare il sovraccarico (come indicato nell'esempio sopra)
- Da dare
null
come singolo argomento a un parametro vararg
Un semplice esempio di quest'ultimo è il seguente:
static void vararg(Object... os) {
System.out.println(os.length);
}
Quindi, possiamo avere quanto segue:
vararg(null, null, null); // prints "3"
vararg(null, null); // prints "2"
vararg(null); // throws NullPointerException!
vararg((Object) null); // prints "1"
Guarda anche
Domande correlate
null
in questo caso), assicurati che entrambi i sovraccarichi si comportino allo stesso modo rispetto a quel valore!