JavaRush /Blog Java /Random-PL /9 rzeczy na temat NULL w Javie
Sdu
Poziom 17

9 rzeczy na temat NULL w Javie

Opublikowano w grupie Random-PL
Java i null idą w parze. Prawie nie ma programisty Java, który nie spotkałby się z „ wyjątkiem wskaźnika zerowego ” i jest to smutny fakt. Nawet wynalazca koncepcji „null” nazwał to swoim miliardowym błędem, więc dlaczego Java to obsługuje? null jest tu od dawna i myślę, że twórcy Javy wiedzą, że stwarza więcej problemów niż rozwiązuje, więc dlaczego wciąż to tolerują. I to mnie jeszcze bardziej zaskakuje, ponieważ filozofia Javy polegała na upraszczaniu rzeczy i dlatego nie ma już nic do roboty ze wskaźnikami, przeciążaniem operatorów i wielokrotnym dziedziczeniem, ale dlaczego wartość null? 9 rzeczy na temat NULL w Javie - 1Cóż, nie znam odpowiedzi na to pytanie, ale wiem, że niezależnie od tego, jak bardzo wartość null jest krytykowana przez programistów Java i społeczność open source, musimy z tym żyć. Zamiast żałować, lepiej dowiedzieć się więcej i mieć pewność, że poprawnie używamy wartości null.

Dlaczego warto poznać wartość null w Javie?

Ponieważ jeśli nie będziesz zwracać uwagi na wartość null, możesz być pewien, że Java sprawi, że będziesz cierpieć w straszny sposób java.lang.NullPointerExceptioni wyciągniesz wnioski z lekcji, ale pójdziesz trudną drogą. Pisanie kodu odpornego na awarie to sztuka, a Twój zespół, klienci i użytkownicy to docenią. Z mojego doświadczenia wynika, że ​​jednym z głównych powodów NullPointerExceptionjest brak wiedzy na temat wartości null w Javie. Wielu z Was zna już słowo null, reszta będzie mogła dowiedzieć się starych i nowych rzeczy na temat słowa kluczowego null. Przejrzyjmy lub nauczmy się kilku ważnych rzeczy na temat wartości null w Javie.

Co ma wartość null w Javie

Jak powiedziałem, wartość null jest bardzo, bardzo ważnym pojęciem w Javie. Pierwotnie został wynaleziony, aby wskazać brak czegoś, na przykład nieobecność użytkownika, zasobu lub czegokolwiek innego, ale był zagadką dla programistów Java z dużą ilością plików null pointer exception. W tym samouczku poznamy podstawowe fakty na temat słowa kluczowego null w Javie i poznamy kilka sztuczek, które pozwolą uniknąć problemów null pointer exceptionsi zminimalizować sprawdzanie wartości null.
  1. Po pierwsze, null jest słowem kluczowym w Javie, podobnie jak publiclub . Wielkość liter jest istotna, nie można zapisać wartości null jako wartości Null lub NULL, kompilator jej nie rozpozna i zostanie zgłoszony błąd.staticfinal

    Object obj = NULL; // Not Ok
    Object obj1 = null //Ok

    Często programiści, którzy przeszli z innych języków programowania, napotykają ten problem, ale przy korzystaniu z nowoczesnych IDE problem staje się nieistotny. Obecnie IDE, takie jak Eclipse lub NetBeans, mogą naprawić ten błąd podczas pisania, ale w erze Notatnika, Vima i Emacsa był to powszechny problem, który mógł pochłonąć dużo cennego czasu.

  2. Так же, Jak каждый примитив имеет oznaczający по умолчанию, например, у int это 0, у boolean это false, null это oznaczający по умолчанию любых ссылочных типов, проще говоря, для всех obiektов. Так же, Jak при создании логической переменной ее oznaczający по умолчанию равно false, так и любые ссылочные переменные в Java по умолчанию будут равны null. Это истинно для всех типов переменных: переменной-члена Lub локальной переменной, переменной экземпляра Lub статической переменной, кроме того, компилятор будет ругаться, если Вы используете локальную переменную не проинициализировав ее.

    private static Object myObj;
    public static void main(String args[]){
        System.out.println("What is value of myObjc : " + myObj);
    }
    What is value of myObjc : null

    Это истинно Jak для статических, так и для не статических obiektов, Jak Вы можете видеть здесь, я сделал myObj статической ссылкой, так что я могу использовать ее непосредственно в методе main, который является статическим методом и не позволяет обращаться к не статическим переменным изнутри.

  3. Несмотря на распространенное заблуждение, null это не obiekt (Object) и ни тип. Это просто специальное oznaczający, которое может быть назначено любому ссылочному типу, и Вы можете привести null к любому типу, Jak показано ниже:

    String str = null; // null can be assigned to String
    Integer itr = null; // you can assign null to Integer also
    Double dbl = null; // null can also be assigned to Double
    String myStr = (String) null; // null can be type cast to String
    Integer myItr = (Integer) null; // it can also be type casted to Integer
    Double myDbl = (Double) null; // yes it's possible, no error

    Как Вы можете видеть, приведение null к любому ссылочному типу пройдет успешно Jak во время компиляции, так и во время выполнения программы. В отличии от того, что многие из Вас возможно подумали, это не приведет к выбрасыванию NullPointerException.

  4. null может быть назначен только ссылочному типу, Вы не можете назначить null примитивной переменной вроде int, double, float Lub boolean. Компилятор выразит Вам свое недовольство если Вы сделаете Jak показано ниже:

    int i = null; // type mismatch : cannot convert from null to int
    short s = null; // type mismatch : cannot convert from null to short
    byte b = null: // type mismatch : cannot convert from null to byte
    double d = null; //type mismatch : cannot convert from null to double
    
    Integer itr = null; // this is ok
    int j = itr; // this is also ok, but NullPointerException at runtime

    Как Вы можете видеть, когда мы непосредственно присваиваем null примитиву, то получаем ошибку процесса компиляции, но, если присвоить null obiektу класса-обертки, а затем присвоить этот obiekt соответствующему примитивному типу, компилятор не отреагирует, но мы будем вознаграждены null pointer exception во время выполнения. Это происходит из-за авто упаковки (autoboxing) в Java, и мы еще встретимся с ним в следующем пункте.

  5. Любой класс-обертка со oznaczającyм null будет выбрасывать java.lang.NullPointerException когда Java распакует(unbox) его в примитивную переменную. Некоторые программисты делают ошибку допуская, что авто упаковка(autoboxing) позаботится о конвертации null в oznaczający по умолчанию для соответствующего примитивного типа, например, 0 для int, false для boolean и т.д., но это не верно, в чем можно убедиться ниже:

    Integer iAmNull = null;
    int i = iAmNull; // Remember - No Compilation Error

    Но, когда Вы запустите данный фрагмент kodа, в консоли Вы увидите

    Exception in thread "main" java.lang.NullPointerException

    Это часто происходит при работе с HashMap и Integer key. Выполнение kodа, показанного ниже прервется, Jak только Вы его запустите.

    import java.util.HashMap;
    import java.util.Map;
    /**
    * An example of Autoboxing and NullPointerExcpetion
    *
    * @author WINDOWS 8
    */
    public class Test {
        public static void main(String args[]) throws InterruptedException {
            Map numberAndCount = new HashMap<>();
            int[] numbers = {3, 5, 7,9, 11, 13, 17, 19, 2, 3, 5, 33, 12, 5};
            for(int i : numbers){
                int count = numberAndCount.get(i);
                numberAndCount.put(i, count++); // NullPointerException here
            }
        }
    }

    Output: Exception in thread "main" java.lang.NullPointerException at Test.main(Test.java:25)

    Ten kod wygląda bardzo prosto i nieszkodliwie. Po prostu liczysz, ile razy dana liczba pojawia się w tablicy, co jest klasyczną techniką znajdowania duplikatów. Deweloper bierze poprzednio obliczoną ilość, zwiększa ją o jeden i wstawia z powrotem do Map. IntegerMógłby pomyśleć, że konwersją na int, tak jak ma to miejsce w przypadku wywołania metody , zajmie się auto-boxing put(), ale zapomina, że ​​jeśli liczba nie została jeszcze policzona, metoda get()zwróci HashMapnull, a nie zero, ponieważ wartość domyślna jest liczbą całkowitą, ma wartość null, a nie 0, a automatyczne blokowanie zostanie wyrzucone null pointer exceptionpodczas próby konwersji liczby całkowitej na zmienną int.

  6. Operator instanceofzwróci wartość false, jeśli jako parametr zostanie określona zmienna referencyjna o wartości null lub sama wartość null. Przykład:

    Integer iAmNull = null;
    if(iAmNull instanceof Integer){
        System.out.println("iAmNull is instance of Integer");
    }else{
        System.out.println("iAmNull is NOT an instance of Integer");
    }

    Output : iAmNull is NOT an instance of Integer

    Jest to ważna właściwość operatora instanceof, która sprawia, że ​​jest on przydatny do testowania rzutowania typów.

  7. Wiesz, że nie możesz wywołać metody niestatycznej na zmiennej referencyjnej o wartości null, wywoła to metodę NullPointerException, ale możesz nie wiedzieć, że możesz wywołać metodę statyczną na zmiennej referencyjnej o wartości null. Ponieważ metody statyczne używają wiązania statycznego, nie wyrzucają NullPointerException. Oto przykład:

    public class Testing {
        public static void main(String args[]){
            Testing myObject = null;
            myObject.iAmStaticMethod();
            myObject.iAmNonStaticMethod();
        }
        private static void iAmStaticMethod(){
            System.out.println("I am static method, can be called by null reference");
        }
        private void iAmNonStaticMethod(){
            System.out.println("I am NON static method, don't date to call me by null");
        }
    }

    Output: I am static method, can be called by null reference
    Exception in thread "main" java.lang.NullPointerException
    at Testing.main(Testing.java:11)
  8. Możesz przekazać null jako parametr do metody, która akceptuje dowolny typ odniesienia, na przykład:

    public void print(Object obj)

    można nazwać np

    print(null)

    Jest to normalne z punktu widzenia kompilatora, ale późniejsze zachowanie jest całkowicie zależne od metody. Metoda null-safe nie wyrzuci NullPointerException, ale po prostu zakończy się bezpiecznie. Jeśli pozwala na to logika biznesowa, zaleca się pisanie metod bezpiecznych dla wartości null.

  9. Wartość null można porównać za pomocą operatorów ==(równych) i !=(nie równych), ale nie można jej używać z innymi operatorami arytmetycznymi lub logicznymi, takimi jak <(mniejszy niż) lub >(większy niż). W przeciwieństwie do SQL, Java null == nullzwróci wartość true, jak pokazano poniżej:

    public class Test {
    	public static void main(String args[]) throws InterruptedException {
    		String abc = null;
    		String cde = null;
    		if(abc == cde){
    			System.out.println("null == null is true in Java");
    		}
    		if(null != null){
    			System.out.println("null != null is false in Java");
    		}
    		// classical null check
    		if(abc == null){
    			// do something
    		}
    		// not ok, compile time error
    		if(abc > null){
    
    		}
    	}
    }

    Output:
    null == null is true in Java
To wszystko dotyczy wartości null w Javie. Zdobywając doświadczenie w programowaniu w języku Java i stosując proste triki, aby uniknąć NullPointerException, możesz zapewnić bezpieczeństwo swojego kodu. Ponieważ null można traktować jako wartość pustą lub niezainicjowaną, często jest to źródłem nieporozumień, dlatego ważne jest udokumentowanie zachowania metody po wprowadzeniu wartości null. Zawsze pamiętaj, że null jest wartością domyślną zmiennych referencyjnych i nie możesz wywoływać metod instancji ani uzyskiwać dostępu do zmiennych instancji przy użyciu referencji o wartości null w Javie.
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION