Co to jest null w Javie?

Co to jest null?

Czy null jest instancją czegokolwiek?

Do jakiego zestawu należy null?

Jak to jest reprezentowane w pamięci?

Author: Joachim Sauer, 2010-04-25

14 answers

Czy null jest instancją czegokolwiek?

Nie, Nie Ma typu, który null jest instanceof.

15.20.2 Operator Porównywania Typówinstanceof

RelationalExpression:
    RelationalExpression instanceof ReferenceType

W czasie wykonywania, wynikiem operatora instanceof jest true, Jeśli wartość RelationalExpression nie jest null i odniesienie może być rzucone na ReferenceType bez podnoszenia ClassCastException. W przeciwnym razie wynikiem jest false.

Oznacza to, że dla każdego typ E i R, dla dowolnych E o, gdzie o == null, o instanceof R jest zawsze false.


Do jakiego zbioru należy 'null'?

JLS 4.1 rodzaje typów i wartości

Istnieje również specjalny typ null , typ wyrażenia null, który nie ma nazwy. Ponieważ Typ nullnie ma nazwy, nie Można zadeklarować zmiennej typu nulllub oddać do typu null. The null reference jest jedyną możliwą wartością wyrażenia typu null . Odniesienie null może być zawsze rzucone na dowolny typ odniesienia. W praktyce programista może zignorować Typ null i po prostu udawać, że null jest tylko specjalnym literałem, który może być dowolnego typu odniesienia.


Co to jest null?

Jak cytat z JLS powyżej mówi, w praktyce można po prostu udawać ,że jest to " tylko specjalny literał, który może być dowolnym odniesieniem Typ".

W Javie, null == null (Nie zawsze tak jest w innych językach). Zauważ również, że na mocy umowy posiada również tę specjalną własność (od java.lang.Object):

public boolean equals(Object obj)

Dla dowolnej wartości odniesienia nienull x, x.equals(null) powinno return false.

Jest to również wartość domyślna (dla zmiennych, które je posiadają) dla wszystkich typów odniesienia:

JLS 4.12.5 wartości początkowe zmiennych

  • każda zmienna klasy, zmienna instancji lub komponent tablicy jest inicjalizowana wartością domyślną podczas tworzenia:
    • dla wszystkich typów referencyjnych wartością domyślną jest null.

Sposób jego użycia jest różny. Możesz go użyć, aby włączyć tzw. leniwą inicjalizację pól, gdzie pole miałoby wartość początkową null, dopóki nie zostanie faktycznie użyte, gdzie zostanie zastąpione przez wartość "rzeczywistą" (która może być kosztowne do obliczenia).

Istnieją również inne zastosowania. Weźmy prawdziwy przykład z java.lang.System:

public static Console console()

Zwraca : konsola systemowa, jeśli istnieje, w przeciwnym razie null.

Jest to bardzo popularny wzorzec użycia: null jest używany do oznaczania nieistnienia obiektu.

Oto kolejny przykład użycia, tym razem z java.io.BufferedReader:

public String readLine() throws IOException

Zwraca : A String zawierający zawartość linii, bez żadnych znaków zakończenia linii, lub null jeśli osiągnięto koniec strumienia.

Więc tutaj, readLine() zwróci instanceof String dla każdej linii, aż w końcu zwróci null, aby oznaczać koniec. Pozwala to na przetwarzanie każdej linii w następujący sposób:

String line;
while ((line = reader.readLine()) != null) {
   process(line);
}

Można zaprojektować API tak, aby warunek zakończenia nie zależał od readLine() zwracającego null, ale widać, że ten projekt ma tę zaletę, że rzeczy zwięzłe. Zauważ, że nie ma problemu z pustymi liniami, ponieważ pusta linia "" != null.

Weźmy inny przykład, tym razem z java.util.Map<K,V>:

V get(Object key)

Zwraca wartość, do której mapowany jest określony klucz, lub null Jeśli ta mapa nie zawiera mapowania dla klucza.

Jeśli ta mapa pozwala na wartości null, to wartość zwracana null niekoniecznie oznacza, że mapa nie zawiera mapowania dla klucza; jest również możliwe, że mapa jawnie mapuje klucz do null. Operacja containsKey może być użyta do rozróżnienia tych dwóch przypadków.

Tutaj zaczynamy widzieć, jak używanie null może komplikować rzeczy. Pierwsza instrukcja mówi, że jeśli klucz nie jest mapowany, zwracane jest null. Druga instrukcja mówi, że nawet jeśli klucz jest mapowany, null może również być zwrócone.

W przeciwieństwie, java.util.Hashtable utrzymuje rzeczy prostsze, nie zezwalając null klucze i wartości; its V get(Object key), jeśli zwraca null, jednoznacznie oznacza, że klucz nie jest mapowany.

Możesz przeczytać resztę API i dowiedzieć się, gdzie i w jaki sposób null jest używany. Należy pamiętać, że nie zawsze są to przykłady najlepszych praktyk.

Ogólnie rzecz biorąc, null są używane jako specjalne wartości do oznaczenia:

  • Stan Niezawiniony
  • warunek zakończenia
  • nieistniejący obiekt
  • nieznana wartość

Jak czy jest reprezentowany w pamięci?

W Javie? Nie twoja sprawa. I najlepiej tak trzymać.


Czy null to dobra rzecz?

To jest teraz granica subiektywne. Niektórzy mówią, że null powoduje wiele błędów programistycznych, których można było uniknąć. Niektórzy mówią, że w języku, który łapie NullPointerException, takim jak Java, dobrze jest go używać, ponieważ szybko zawiedziesz się na błędach programisty. Niektóre osoby unikają null używając wzorca obiektu Null , itd.

Jest to ogromny temat sam w sobie, więc najlepiej jest go przedyskutować jako odpowiedź na inne pytanie.

Na koniec przytoczę cytat od samego wynalazcy, C. A. R Hoare ' a (z quicksortowej sławy):]}

Nazywam to błędem za miliard dolarów. to było wynalezienie null odniesienia w 1965 roku. W tym czasie projektowałem pierwszy kompleksowy system typów odniesień w języku obiektowym (ALGOL w). Moim celem było upewnij się, że korzystanie z referencji powinno być całkowicie bezpieczne, a sprawdzanie wykonywane jest automatycznie przez kompilator. Ale nie mogłem oprzeć się pokusie, aby umieścić odniesienie null, po prostu dlatego, że było tak łatwe do wdrożenia. Doprowadziło to do niezliczonych błędów, luk w zabezpieczeniach i awarii systemu, które prawdopodobnie spowodowały miliard dolarów bólu i szkód w ciągu ostatnich czterdziestu lat.

Wideo z tej prezentacji sięga głębiej; jest to zalecany zegarek.

 288
Author: polygenelubricants,
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-08-25 13:23:01

Czy null jest instancją czegokolwiek?

Nie. Dlatego null instanceof X zwróci false dla wszystkich klas X. (Nie daj się zwieść faktowi, że możesz przypisać null do zmiennej, której typ jest typem obiektu. Ściśle mówiąc, przypisanie wymaga konwersji typu niejawnego; patrz poniżej.)

Do jakiego zbioru należy 'null'?

Jest jedynym członkiem typu null, gdzie Typ null jest zdefiniowany jako follows:

"istnieje również specjalny typ null, typ wyrażenia null, który nie ma nazwy. Ponieważ Typ null nie ma nazwy, niemożliwe jest zadeklarowanie zmiennej typu null lub oddanie jej do typu null. Odniesienie null jest jedyną możliwą wartością wyrażenia typu null. Odniesienie null może być zawsze rzucone do dowolnego typu odniesienia. W praktyce programista może zignorować Typ null i po prostu udawać, że null jest tylko specjalnym literałem, który może być dowolny typ odniesienia." JLS 4.1

Co to jest null?

Patrz wyżej. W niektórych kontekstach, null jest używany do oznaczenia "brak obiektu" lub "Nieznany" lub "niedostępny", ale te znaczenia są specyficzne dla aplikacji.

Jak to jest reprezentowane w pamięci?

Jest to specyficzne dla implementacji i nie będzie można zobaczyć reprezentacji null w czystym programie Java. (Ale {[3] } jest reprezentowany jako zerowy adres / wskaźnik maszyny W większość, jeśli nie wszystkie implementacje Javy.)

 27
Author: Stephen C,
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
2012-10-24 01:32:40

Co to jest null?

To nic takiego.

Czy null jest przypadkiem czegokolwiek?

Nie, ponieważ to nic nie może być instancją żadnej rzeczy.

Do jakiego zestawu należy null?

No any set

Jak to jest reprezentowane w pamięci?

Jeśli jakieś odniesienia wskazują na to tak:

Object o=new Object();

W pamięci sterty trochę miejsca przypisanego do nowo utworzonego obiektu. A o wskaże przydzielone miejsce w pamięci.

Teraz o=null;

Oznacza to, że teraz o nie wskaże tej przestrzeni pamięci obiektu.

 13
Author: Sanjay Jain,
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
2011-08-31 14:31:01

Nie to nie jest instance of anything, instanceof zawsze będzie false.

 8
Author: Tom,
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
2010-04-25 06:00:24

Słowo kluczowe null to literał, który reprezentuje odniesienie null, takie, które nie odnosi się do żadnego obiektu . null jest wartością domyślną zmiennych typu referencyjnego.

Zobacz też:

Null: Java Glossary

 5
Author: Adriaan Stander,
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
2010-04-25 06:08:18

Null w Javie (tm)

W C i C++, "NULL" jest stałą zdefiniowaną w pliku nagłówkowym, o wartości takiej jak:

    0

Lub:

    0L

Lub:

    ((void*)0)

W zależności od opcji kompilatora i modelu pamięci. NULL nie jest, ściśle mówiąc, częścią samego C / C++.

W języku Java (tm), "null" nie jest słowem kluczowym, ale specjalnym literałem typu null. Może być rzucany do dowolnego typu odniesienia, ale nie do żadnego prymitywnego typu, takiego jak int lub boolean. Literał null Nie koniecznie mieć wartość zero. I nie można przypisać do typu null lub zadeklarować zmiennej tego typu.

 5
Author: p27,
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
2011-05-06 07:11:48

Null nie jest instancją żadnej klasy.

Można jednak przypisać null do zmiennych dowolnego typu (object lub array):

 // this is false   
 boolean nope = (null instanceof String);

 // but you can still use it as a String
 String x = null;
 "abc".startsWith(null);
 4
Author: Thilo,
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
2010-04-25 06:15:09

null jest szczególną wartością, nie jest instancją niczego. Z oczywistych powodów nie może to być instanceof cokolwiek.

 3
Author: fastcodejava,
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
2010-04-25 06:14:49

Reprezentacja bajtowa

null Java ma bezpośrednie wsparcie dla JVM: do jej implementacji używane są trzy instrukcje:

  • aconst_null: np. ustawić zmienną na {[0] } jak w Object o = null;
  • ifnull i ifnonnull: np. aby porównać obiekt do {[0] } jak w if (o == null)

Rozdział 6 " the Java Virtual Machine Instruction Set " wspomina następnie o efektach null na innych instrukcjach: rzuca NullPointerException dla wielu z nich.

2.4. "Typy i wartości odniesienia" wymienia również null w kategoriach ogólnych:

Wartość odniesienia może być również specjalnym odniesieniem null, odniesieniem do żadnego obiektu, który będzie oznaczony tutaj przez null. Odniesienie null początkowo nie ma typu run-time, ale może być rzucane na dowolny typ. Domyślną wartością typu odniesienia jest null.

 3
Author: Ciro Santilli 新疆改造中心 六四事件 法轮功,
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
2018-03-09 15:10:33

null jest wartością specjalną, która nie jest instancją żadnej klasy. Ilustruje to następujący program:

public class X {
   void f(Object o)
   { 
      System.out.println(o instanceof String);   // Output is "false"
   }
   public static void main(String[] args) {
      new X().f(null);
   }
}
 2
Author: Itay Maman,
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
2010-04-25 06:03:26

Null w Javie jest podobny / podobny do nullptr w C++.

Program w C++:

class Point
{
    private:
       int x;
       int y;
    public:
       Point(int ix, int iy)
       {
           x = ix;
           y = iy;
       }
       void print() { std::cout << '(' << x << ',' << y << ')'; }
};
int main()
{
    Point* p = new Point(3,5);
    if (p != nullptr)
    {
       p->print();
       p = nullptr;
    }
    else
    {
        std::cout << "p is null" << std::endl;
    }
    return 0;
}

Ten sam program w Javie:

public class Point {
    private int x;
    private int y;
    public Point(int ix, int iy) {
        x = ix;
        y = iy;
    }
    public void print() { System.out.print("(" + x + "," + y + ")"); }
}
class Program
{
    public static void main(String[] args) {
        Point p = new Point(3,5);
        if (p != null)
        {
            p.print();
            p = null;
        }
        else
        {
            System.out.println("p is null");
        }
    }
}

Teraz rozumiesz z powyższych kodów co to jest null w Javie? Jeśli nie to polecam Ci nauczyć się pointerów w C / C++ i wtedy zrozumiesz.

Zauważ, że w C, w przeciwieństwie do C++, nullptr jest niezdefiniowany, ale zamiast tego używa się NULL, co może być również używane w C++, ale w C++ nullptr jest bardziej pożądane niż tylko NULL, ponieważ NULL w C jest zawsze związane ze wskaźnikami i tyle, więc w C++ do końca słowa dodano przyrostek "ptr", a także wszystkie litery są teraz małymi literami, ale to jest mniej ważne.

W Javie każda zmienna klasy typu non-primitive jest zawsze odniesieniem do obiektu tego typu lub dziedziczeniem, a null jest odniesieniem do obiektu klasy null, ale nie wskaźnikiem null, ponieważ w Javie nie ma czegoś takiego "wskaźnika", ale zamiast tego używane są odniesienia do obiektów klasy, A null w Javie jest związane z obiektem klasy odwołania, więc można go również nazwać "nullref" lub "nullrefobj", ale jest to długie, więc po prostu nazwij to "null".

W C++ można używać wskaźników i wartości nullptr dla opcjonalne member/variable, tzn. member / zmienna, która nie ma wartości, a jeśli nie ma wartości, to jest równa nullptr, więc jak null w Javie może być użyty na przykład.

 1
Author: Farewell Stack Exchange,
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-15 12:31:11

Interesującym sposobem postrzegania null w Javie moim zdaniem jest postrzeganie go jako czegoś, co nie oznacza braku informacji, ale po prostu jako dosłownej wartości, którą można przypisać do odniesienia dowolnego typu. Jeśli pomyślisz o tym, jeśli oznaczałoby to brak informacji, to dla A1= = A2 to prawda nie ma sensu (w przypadku, gdy obie miały przypisaną wartość null), ponieważ naprawdę mogłyby wskazywać na dowolny obiekt (po prostu nie wiemy, jakie obiekty powinny wskazywać)... Przy okazji null = = NULL zwraca true w Javie. Jeśli np. java byłaby podobna do SQL:1999, to NULL==NULL zwróci unknown (wartość logiczna w SQL: 1999 może przyjmować trzy wartości: true, false i unknown, ale w praktyce unknown jest implementowana jako null w rzeczywistych systemach)... http://en.wikipedia.org/wiki/SQL

 0
Author: Bat0u89,
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-11-28 19:55:57

W Javie istnieją dwie główne kategorie typów: primitive i reference . Zmienne zadeklarowane typu prymitywnego przechowują wartości; zmienne zadeklarowane typu referencyjnego przechowują odwołania.

String x = null;

W tym przypadku instrukcja inicjalizacji deklaruje zmienną "x". "x" przechowuje odniesienie do łańcucha znaków. Jest null tutaj. Po pierwsze, null nie jest poprawną instancją obiektu, więc nie ma dla niej przydzielonej pamięci. Jest to po prostu wartość, która wskazuje, że obiekt odniesienie nie odnosi się obecnie do obiektu.

 0
Author: Anand,
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-01-29 19:33:50

Krótka i precyzyjna odpowiedź, która odpowiada na wszystkie Twoje pytania formalnie z JLS:

3.10.7. Literał Null

Typ null ma jedną wartość, referencję null, reprezentowaną przez null literalny null, który jest tworzony ze znaków ASCII.

Literał null jest zawsze typu null.

Przydzielane jest tylko odniesienie typu, które jest przypisane do null. Nie przypisujesz żadnej wartości (obiektu) do odniesienia. Takie alokacja jest specyficzna dla JVM, ile odniesień zajmie i w jakim obszarze pamięci zostanie przydzielona.

 0
Author: Oleksii Kyslytsyn,
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-07-13 10:03:45