2014-11-26 15 views
10

natknąłem następującego kodu:NullPointerException lub wypisze zawartość statyczna zmienna na

public class TradingSystem { 

    private static String category = "electronic trading system"; 

    public static void main(String[] args) { 
     TradingSystem system = null; 
     System.out.println(system.category); 
} 

Output: elektroniczny system handlu

Byłem zaskoczony, aby nie znaleźć NullPointerException!

Q1. Dlaczego nie rzucił NullPointerException?

Q2. Lub podczas kompilacji czasu, ze względu na deklarację kategorii o numerze static, który wymienił system (tj. Obiekt odniesienia) na TradingSystem i jako taki został nazwany w zasadzie TradingSystem.category?

+0

Również duplikat http://stackoverflow.com/questions/3293353/how-come-invoking-a-static-method-on-a-null-reference-doesnt-throw-nullpointe – Raedwald

+0

@Raedwald technicznie, to nie dokładnie to powtórzyć. ale dobrze wiedzieć, – KNU

Odpowiedz

7

Java umożliwia dostęp do zmiennych klas (tj. static) przy użyciu składni instancji. Innymi słowy, kompilator pozwala pisać system.category, ale rozwiązuje go pod TradingSystem.category, który jest niezależny od instancji, do której jest uzyskiwany.

Dlatego nie dostaniesz NullPointerException. Jednak ta składnia nie jest czytelna i myląca. Dlatego powinieneś otrzymać ostrzeżenie i sugestię użycia TradingSystem.category zamiast system.category.

+0

więc moja druga propozycja w drugim pytaniu była poprawna. – KNU

3

Twój kod nie różni się koncepcyjnie od następującego kodu.

public class TradingSystem { 

    private static String category = "electronic trading system"; 

    public static void main(String[] args) { 
     System.out.println(TradingSystem.category); 

    } 
} 

Nawet jeśli wydaje się, że używasz odniesienia do obiektu systemowego, to w rzeczywistości używasz wartości statycznej. Java pozwala używać wystąpień, gdy używasz statycznego, ale powinieneś preferować powyższą składnię, aby było jasne, że używasz statycznych.

1

Nigdy nie powinieneś wywoływać metod statycznych za pomocą instancji klas ani nigdy nie jest to potrzebne. Ponieważ metody statyczne są wykonywane na poziomie klasy, instancja nie jest używana, a zatem nie jest zgłaszany wyjątek wskaźnika pustego.

+0

Myślę, że "nigdy nie powinienem dzwonić ..." jest zbyt surowy. Czemu? Jeśli tak, to JAVA nigdy by na to nie zezwoliła, ale pozwala. czemu? ponieważ wszystko, co należy do klasy, naturalnie należy do jej instancji i jak powinno być nazwane, podlega kontekstowi. przynajmniej w sensie dosłownym. – KNU

+0

@KNU Nie zgadzam się. Nie wiem, dlaczego Java pozwala na taki sposób wywoływania metod statycznych (domyślam się, że udało mi się skompilować kod, którego inaczej by nie było), ale prowadzi to tylko do nieoczekiwanego zachowania. Czy możesz podać przykład, w którym jest to korzystne? –

+0

@Konard Nie mówię, że może to być korzystne, ale może być bardziej sensowne/praktyczne użycie odniesienia. na przykład Klienci nie muszą wiedzieć, czy metoda jest statyczna/niestatyczna podczas korzystania z nich, ponieważ członkowie statyczni mogą być wywoływani zarówno w kontekście statycznym, jak i niestatycznym. – KNU

1

Statyczny mówi się, że jest "Z KLASY" nie dla przedmiotu klasy. Więc tutaj

System.out.println (system.category); "system działa jako TradingSystem"

który ma rację. Ponieważ nie potrzebujesz instancji obiektu, aby wywołać statyczne pole lub metodę.

Powiązane problemy