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!