Il problema è che il String.valueOfmetodo è 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é nullin questo caso viene fornito, viene generato NullPointerException.
La semplice "correzione" è di lanciare nullesplicitamente Objectcome 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
nullcome 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
nullin questo caso), assicurati che entrambi i sovraccarichi si comportino allo stesso modo rispetto a quel valore!