Problem polega na tym, że String.valueOf
metoda jest przeciążona :
Java Specification Language wymaga, aby w tego rodzaju przypadkach wybierać najbardziej szczegółowe przeciążenie :
Jeśli więcej niż jedna metoda składowa jest zarówno dostępna, jak i odpowiednia do wywołania metody, konieczne jest wybranie jednej, która zapewni deskryptor do wysyłania metody w czasie wykonywania. W języku programowania Java obowiązuje zasada, że wybierana jest najbardziej szczegółowa metoda.
A char[]
jest-an Object
, ale nie wszystko Object
jest-a char[]
. W związku z tym char[]
jest bardziej szczegółowe niż Object
i zgodnie z opisem w języku Java String.valueOf(char[])
w tym przypadku wybierane jest przeciążenie.
String.valueOf(char[])
oczekuje, że tablica nie będzie null
, a ponieważ null
jest podana w tym przypadku, zgłasza NullPointerException
.
Łatwym "rozwiązaniem" jest null
jawne rzutowanie w Object
następujący sposób:
System.out.println(String.valueOf((Object) null));
Powiązane pytania
Morał historii
Jest kilka ważnych:
- Efektywna Java 2nd Edition, pozycja 41: rozsądnie używaj przeciążania
- To, że możesz przeciążać, nie oznacza, że powinieneś za każdym razem
- Mogą powodować zamieszanie (zwłaszcza jeśli metody dają bardzo różne efekty)
- Korzystając z dobrego IDE, możesz sprawdzić, które przeciążenie jest wybrane w czasie kompilacji
- Z Eclipse, można myszką widzimy po powyższej wypowiedzi i widzę, że rzeczywiście The
valueOf(char[])
wybrano przeciążenie!
- Czasami chcesz jawnie przesyłać
null
(przykłady do naśladowania)
Zobacz też
Na castingu null
Istnieją co najmniej dwie sytuacje, w których jawne rzutowanie null
na określony typ odniesienia jest konieczne:
- Aby wybrać przeciążenie (jak podano w powyższym przykładzie)
- Aby dać
null
jako pojedynczy argument do parametru vararg
Prosty przykład tego ostatniego jest następujący:
static void vararg(Object... os) {
System.out.println(os.length);
}
Następnie możemy mieć:
vararg(null, null, null);
vararg(null, null);
vararg(null);
vararg((Object) null);
Zobacz też
Powiązane pytania
null
w tym przypadku), upewnij się, że oba przeciążenia działają tak samo w odniesieniu do tej wartości!String.valueOf(Object)
i takvalueOf(char[])
robi zupełnie inne rzeczy (niezależnie od tego,null
czy nie), że być może w ogóle nie powinni byli być przeciążeni.return null;
byłaby dokładnie taka sama jakreturn (Object) null;
?Problem w tym, że dzwonisz,
String.valueOf(char[])
a nieString.valueOf(Object)
.Powodem tego jest fakt, że Java zawsze wybiera najbardziej konkretną wersję przeciążonej metody, która działa z podanymi parametrami.
null
jest prawidłową wartościąObject
parametru, ale jest również prawidłową wartościąchar[]
parametru.Aby Java używała tej
Object
wersji, przekaż jąnull
przez zmienną lub określ jawne rzutowanie na Object:Object o = null; System.out.println("String.valueOf(null) = " + String.valueOf(o)); // or System.out.println("String.valueOf(null) = " + String.valueOf((Object) null));
źródło
Błąd o numerze 4867608 został zgłoszony w ten sposób w 2003 r., Który został rozwiązany jako „nie da się naprawić” za pomocą tego wyjaśnienia.
źródło
Użyj
String.valueOf(null: Any)
w Scali.źródło