Odpowiedzi:
Możesz rzutować null
na dowolny typ odniesienia bez żadnych wyjątków.
println
Metoda nie wyrzucać pustego wskaźnika, ponieważ najpierw sprawdza, czy obiekt jest null lub nie. Jeśli jest pusty, to po prostu drukuje ciąg "null"
. W przeciwnym razie wywoła toString
metodę tego obiektu.
Dodawanie dodatkowych szczegółów:String.valueOf(object)
Metoda wywołania metody drukowania metod wewnętrznych na obiekcie wejściowym. W valueOf
metodzie to sprawdzenie pomaga uniknąć wyjątku wskaźnika zerowego:
return (obj == null) ? "null" : obj.toString();
Przez resztę zamieszania wywołanie dowolnej metody na obiekcie o wartości NULL powinno zgłosić wyjątek wskaźnika NULL, jeśli nie jest to szczególny przypadek.
Możesz rzutować null
na dowolny typ odniesienia. Możesz także wywoływać metody, które obsługują null
jako argument, np. System.out.println(Object)
Robi, ale nie możesz odwoływać się do null
wartości i wywoływać na niej metodę.
BTW Istnieje trudna sytuacja, w której wydaje się, że można wywoływać metody statyczne na null
wartościach.
Thread t = null;
t.yield(); // Calls static method Thread.yield() so this runs fine.
t.yield() -> Thread.yeld()
? Podobne do tego, jak final int i = 1; while (i == 1)
jest zoptymalizowany dowhile(true)
To jest z założenia. Możesz rzutować null
na dowolny typ odniesienia. W przeciwnym razie nie byłoby możliwe przypisanie go do zmiennych odniesienia.
Rzucanie wartości null jest wymagane w przypadku następującej konstrukcji, w której metoda jest przeciążona, a jeśli do tych przeciążonych metod zostanie przekazana wartość null, wówczas kompilator nie wie, jak usunąć niejednoznaczność, dlatego w takich przypadkach musimy wpisać typ null:
class A {
public void foo(Long l) {
// do something with l
}
public void foo(String s) {
// do something with s
}
}
new A().foo((String)null);
new A().foo((Long)null);
W przeciwnym razie nie można wywołać wymaganej metody.
String bar = null;
Rzutuje null
wartość na String
. Do tej pory musiałem tylko jawnie nadawać wartość NULL w teście, w którym metoda została przeciążona i chciałem przetestować jej zachowanie przy użyciu danych wejściowych NULL. Mimo to, dobrze wiedzieć, miałem zamiar napisać podobną odpowiedź, zanim znalazłem twoją.
l instanceof Long
i s instanceof String
wróci false
w tych przypadkach.
Wiele odpowiedzi tutaj już wspomina
Możesz ustawić wartość null na dowolny typ odwołania
i
Jeśli argument jest pusty, to ciąg równy „null”
Zastanawiałem się, gdzie to jest określone, i sprawdziłem specyfikację Java:
Referencję zerową można zawsze przypisać lub rzutować na dowolny typ referencji (§5.2, §5.3, §5.5).
Jeśli odwołanie ma wartość null, jest konwertowane na ciąg „null” (cztery znaki ASCII n, u, l, l).
Jak napisali inni, możesz rzucić zero na wszystko. Zwykle nie potrzebujesz tego, możesz napisać:
String nullString = null;
bez umieszczania tam obsady.
Ale są sytuacje, w których takie obsady mają sens:
a) jeśli chcesz się upewnić, że wywoływana jest określona metoda, na przykład:
void foo(String bar) { ... }
void foo(Object bar) { ... }
wtedy wpiszesz różnicę
foo((String) null) vs. foo(null)
b) jeśli zamierzasz używać swojego IDE do generowania kodu; na przykład zazwyczaj piszę testy jednostkowe, takie jak:
@Test(expected=NullPointerException.class)
public testCtorWithNullWhatever() {
new MyClassUnderTest((Whatever) null);
}
Robię TDD; oznacza to, że klasa „MyClassUnderTest” prawdopodobnie jeszcze nie istnieje. Zapisując ten kod, mogę następnie użyć mojego IDE do wygenerowania nowej klasy; a następnie wygenerować konstruktor akceptujący „wszystko” argument „po wyjęciu z pudełka” - IDE może stwierdzić z mojego testu, że konstruktor powinien wziąć dokładnie jeden argument typu Cokolwiek.
Jest to bardzo przydatne, gdy używa się metody, która w innym przypadku byłaby niejednoznaczna. Na przykład: JDialog ma konstruktory z następującymi podpisami:
JDialog(Frame, String, boolean, GraphicsConfiguration)
JDialog(Dialog, String, boolean, GraphicsConfiguration)
Muszę użyć tego konstruktora, ponieważ chcę ustawić GraphicsConfiguration, ale nie mam elementu nadrzędnego dla tego okna dialogowego, więc pierwszy argument powinien być pusty. Za pomocą
JDialog(null, String, boolean, Graphicsconfiguration)
jest niejednoznaczny, więc w tym przypadku mogę zawęzić wywołanie, ustawiając null na jeden z obsługiwanych typów:
JDialog((Frame) null, String, boolean, GraphicsConfiguration)
Ta funkcja języka jest wygodna w tej sytuacji.
public String getName() {
return (String) memberHashMap.get("Name");
}
Jeśli memberHashMap.get („Nazwa”) zwraca null, nadal chcesz, aby powyższa metoda zwracała null bez zgłaszania wyjątku. Bez względu na klasę, null to null.