Brak wyjątku podczas wpisywania z null w Javie

String x = (String) null;

Dlaczego nie ma wyjątku w tym oświadczeniu?

String x = null;
System.out.println(x);

Drukuje null. Ale .toString() metoda powinna rzucać wyjątek wskaźnika null.

Author: anubhava, 2013-09-10

9 answers

Możesz rzucić null do dowolnego typu odniesienia bez żadnego wyjątku.

println metoda nie rzuca wskaźnika null, ponieważ najpierw sprawdza, czy obiekt jest null, czy nie. Jeśli null to po prostu wypisuje łańcuch "null". W przeciwnym razie wywoła metodę toString tego obiektu.

Dodanie więcej szczegółów: wewnętrznie metody drukowania wywołują metodę String.valueOf(object) na obiekcie wejściowym. W metodzie valueOf ta kontrola pomaga uniknąć expeitonu wskaźnika null:

return (obj == null) ? "null" : obj.toString();

Dla w pozostałej części zamieszania, wywołanie dowolnej metody na obiekcie null powinno wywołać wyjątek wskaźnika null, jeśli nie specjalny przypadek.

 247
Author: Juned Ahsan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-18 07:29:02

Możesz rzucić null do dowolnego typu odniesienia. Można również wywoływać metody, które obsługują null jako argument, np. System.out.println(Object) robi, ale nie można odwoływać się do wartości null i wywoływać na niej metody.

BTW jest trudna sytuacja, gdy wydaje się, że można wywoływać statyczne metody na wartościach null.

Thread t = null;
t.yield(); // Calls static method Thread.yield() so this runs fine.
 123
Author: Peter Lawrey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-17 22:48:24

To jest z założenia. Możesz rzucić null do dowolnego typu odniesienia. W przeciwnym razie nie byłby w stanie przypisać go do zmiennych referencyjnych.

 30
Author: André Stannek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-10 15:57:04

Odlewanie wartości null jest wymagane dla następującego konstruktu, w którym metoda jest przeciążona i jeśli null jest przekazywana do tych przeciążonych metod, kompilator nie wie, jak wyjaśnić wieloznaczność, dlatego musimy wpisać null w tych przypadkach:

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 nazwać metody, której potrzebujesz.

 12
Author: Mewel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-09 21:04:40

Println(Object) zastosowania String.valueOf()

public static String valueOf(Object obj) {
    return (obj == null) ? "null" : obj.toString();
}

Print(String) nie sprawdza.

public void print(String s) {
    if (s == null) {
        s = "null";
    }
    write(s);
}
 4
Author: rocketboy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-05 12:51:02

Jak pisali inni, możesz rzucić null na wszystko. Normalnie nie potrzebowałbyś tego, możesz napisać:

String nullString = null;
Nie wkładając tam gipsu.

Ale są okazje, w których takie odlewy mają sens:

A) jeśli chcesz mieć pewność, że dana metoda jest wywoływana, jak:

void foo(String bar) {  ... }
void foo(Object bar) {  ... }

Wtedy zrobiłoby to różnicę jeśli wpiszesz

foo((String) null) vs. foo(null)

B) jeśli zamierzasz użyć swojego IDE do wygenerowania kodu; na przykład zazwyczaj piszę testy jednostkowe like:

@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, aby najpierw wygenerować nową klasę; A następnie wygenerować konstruktor akceptujący argument" Whatever ""po wyjęciu z pudełka" - IDE może dowiedzieć się z mojego testu, że konstruktor powinien wziąć dokładnie jeden argument typu Whatever.

 3
Author: GhostCat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-13 08:01:41

Print :

Wydrukuj obiekt. Struna wytwarzana przez strunę.metoda valueOf (Object) jest tłumaczona na bajty

ValueOf :

Jeśli argument jest null, to łańcuch równy "null"; w przeciwnym razie wartość obj.zwracana jest metoda toString ().

Zwróci po prostu łańcuch z wartością "null", gdy obiektem jest null.

 2
Author: Jeroen Vannevel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-10 15:57:30

Jest to bardzo przydatne przy użyciu metody, która w przeciwnym razie 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ć konfigurację graficzną, ale nie mam rodzica dla tego okna, więc pierwszy argument powinien być null. Using

JDialog(null, String, boolean, Graphicsconfiguration) 

Jest niejednoznaczne, więc w tym przypadku mogę zawęzić wywołanie, rzucając null do jednego z obsługiwanych typów:

JDialog((Frame) null, String, boolean, GraphicsConfiguration)
 2
Author: Marten Jacobs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-23 07:22:03

Wiele odpowiedzi tutaj już wspomina

Możesz rzucić null do dowolnego typu odniesienia

I

Jeśli argument jest null, to łańcuch równy "null"

Zastanawiałem się gdzie to jest określone i sprawdziłem specyfikację Javy:

Odniesienie null może być zawsze przypisane lub rzucone do dowolnego typu odniesienia (§5.2, §5.3, §5.5).

Jeśli Referencja jest null, jest konwertowana na łańcuch "null" (cztery ASCII znaki n, u, l, l).

 2
Author: Arigion,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-17 09:19:00