JavaRush /Java Blogu /Random-AZ /Java-da NULL haqqında 9 şey
Sdu
Səviyyə

Java-da NULL haqqında 9 şey

Qrupda dərc edilmişdir
Javanull əl-ələ verir. Demək olar ki, " null göstərici istisnası " ilə qarşılaşmayan Java proqramçısı yoxdur və bu, kədərli bir faktdır. Hətta "null" konsepsiyasının ixtiraçısı bunu milyard dollarlıq səhv adlandırdı, onda Java niyə bunu dəstəkləyir? null uzun müddətdir buradadır və məncə Java-nın yaradıcıları bilirlər ki, o həll etdiyindən daha çox problem yaradır, buna görə də niyə hələ də buna dözürlər. Və bu məni daha da təəccübləndirir, çünki Java-nın fəlsəfəsi hər şeyi sadələşdirməkdən ibarətdir, buna görə də onlar göstəricilər, operatorun həddən artıq yüklənməsi və çoxlu mirasla qarışmırlar, amma niyə null? Java-da NULL haqqında 9 şey - 1Düzü, mən bu sualın cavabını bilmirəm, amma bildiyim odur ki, Java proqramçıları və açıq mənbə icması tərəfindən nə qədər null tənqid edilsə də, biz bununla yaşamalıyıq. Peşman olmaq əvəzinə, daha çox öyrənmək və nulldan düzgün istifadə etdiyimizə əmin olmaq daha yaxşıdır.

Niyə Java-da null haqqında öyrənməlisiniz?

Çünki null-a fikir verməsəniz əmin ola bilərsiniz ki, Java sizi dəhşətli şəkildə əzablandıracaq java.lang.NullPointerExceptionvə dərsinizi öyrənəcəksiniz, amma çətin yolu gedəcəksiniz. Qəzaya davamlı kod yazmaq bir sənətdir və komandanız, müştəriləriniz və istifadəçiləriniz bunu qiymətləndirəcəklər. Mənim təcrübəmdə əsas səbəblərdən biri NullPointerExceptionJava-da null haqqında məlumatın olmamasıdır. Bir çoxunuz artıq null ilə tanışsınız, qalanlarınız null açar sözü haqqında bəzi köhnə və yeni şeyləri öyrənə biləcəksiniz. Java-da null haqqında bəzi vacib şeyləri nəzərdən keçirək və ya öyrənək.

Java-da null nədir

Dediyim kimi, null Java-da çox, çox vacib anlayışdır. Əvvəlcə istifadəçinin, resursun və ya hər hansı bir şeyin olmaması kimi bir şeyin olmamasını göstərmək üçün icad edilmişdir, lakin Java proqramçılarını çoxlu null pointer exception. Bu dərslikdə biz Java-da null açar sözü ilə bağlı əsas faktları öyrənəcəyik və null pointer exceptionsnull yoxlamaları ilə bağlı problemlərin qarşısını almaq və minimuma endirmək üçün bəzi fəndləri öyrənəcəyik.
  1. publicİlk növbədə, null Java-da , və staticya kimi açar sözdür final. Case həssasdır, null null və ya NULL olaraq yaza bilməzsiniz, kompilyator onu tanımayacaq və xəta atılacaq.

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

    Buna tez-tez digər proqramlaşdırma dillərindən keçmiş proqramçılar rast gəlir, lakin müasir IDE-lərdən istifadə edərkən problem əhəmiyyətsiz olur. Bu günlərdə, Eclipse və ya NetBeans kimi IDE-lər siz yazarkən bu səhvi düzəldə bilər, lakin Notepad, Vim və Emacs dövründə bu, çox dəyərli vaxt itirə biləcək ümumi bir problem idi.

  2. Так же, How каждый примитив имеет meaning по умолчанию, например, у int это 0, у boolean это false, null это meaning по умолчанию любых ссылочных типов, проще говоря, для всех an objectов. Так же, How при создании логической переменной ее meaning по умолчанию равно false, так и любые ссылочные переменные в Java по умолчанию будут равны null. Это истинно для всех типов переменных: переменной-члена or локальной переменной, переменной экземпляра or статической переменной, кроме того, компилятор будет ругаться, если Вы используете локальную переменную не проинициализировав ее.

    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

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

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

    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 к любому ссылочному типу пройдет успешно How во время компиляции, так и во время выполнения программы. В отличии от того, что многие из Вас возможно подумали, это не приведет к выбрасыванию NullPointerException.

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

    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 an objectу класса-обертки, а затем присвоить этот an object соответствующему примитивному типу, компилятор не отреагирует, но мы будем вознаграждены null pointer exception во время выполнения. Это происходит из-за авто упаковки (autoboxing) в Java, и мы еще встретимся с ним в следующем пункте.

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

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

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

    Exception in thread "main" java.lang.NullPointerException

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

    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)

    Bu kod çox sadə və zərərsiz görünür. Siz sadəcə olaraq nömrənin massivdə neçə dəfə göründüyünü hesablayırsınız, dublikatları tapmaq üçün klassik texnikadır. Tərtibatçı əvvəlki hesablanmış kəmiyyəti götürür, onu bir artırır və onu yenidən daxil edir Map. IntegerO, hesab edə bilər ki, auto-boxing -ə çevrilmə ilə məşğul olacaq int, məsələn, metod çağırılan zaman put(), lakin o, unudur ki, əgər nömrə hələ sayılmayıbsa, metod sıfıra deyil, sıfıra get()dönəcək HashMap, çünki standart dəyər is Integer bu sıfırdır, 0 deyil və null pointer exceptiontam ədədi dəyişənə çevirmək istəyərkən avtomatik boks atılacaq int.

  6. Parametr kimi null və ya null dəyəri olan hər hansı istinad dəyişəninin özü göstərilərsə, operator instanceoffalse qaytaracaq. Misal:

    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

    Bu operatorun mühüm xüsusiyyətidir instanceofvə onu tipli castların sınaqdan keçirilməsi üçün faydalı edir.

  7. Siz null istinad dəyişənində qeyri-statik metodu çağıra bilməyəcəyinizi bilirsiniz, o zəng edəcək NullPointerException, lakin siz null istinad dəyişənində statik metodu çağıra biləcəyinizi bilmirsiniz. Çünki statik metodlar statik bağlamadan istifadə edir, atmırlar NullPointerException. Budur bir nümunə:

    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. İstənilən istinad növünü qəbul edən metoda parametr kimi null keçirə bilərsiniz, məsələn:

    public void print(Object obj)

    kimi adlandırmaq olar

    print(null)

    Kompilyator baxımından bu normaldır, lakin sonrakı davranış tamamilə metoddan asılıdır. Sıfır təhlükəsiz metod atmayacaq NullPointerException, sadəcə olaraq zərif şəkildə çıxacaq. Biznes məntiqi imkan verirsə, null təhlükəsiz metodları yazmaq tövsiyə olunur.

  9. ==Siz (bərabər) və (bərabər deyil) operatorlarından istifadə edərək null ilə müqayisə edə bilərsiniz , lakin onu (kiçik) və ya (böyük) !=kimi digər arifmetik və ya məntiqi operatorlarla istifadə edə bilməzsiniz . SQL-dən fərqli olaraq, Java aşağıda göstərildiyi kimi doğru olacaq:<>null == null

    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
Bütün bunlar Java-da null haqqındadır. Java proqramlaşdırmasında müəyyən təcrübə qazanmaq və qarşısını almaq üçün sadə fəndlərdən istifadə etməklə NullPointerException, siz kodunuzu təhlükəsiz edə bilərsiniz. Çünki null boş və ya başlamamış dəyər kimi qəbul edilə bilər, bu çox vaxt çaşqınlıq mənbəyidir, buna görə də null dəyəri daxil edildikdə metodun davranışını sənədləşdirmək vacibdir. Həmişə yadda saxlayın ki, null istinad dəyişənlərinin standart dəyəridir və siz Java-da null istinadından istifadə edərək nümunə metodlarına zəng edə və ya nümunə dəyişənlərinə daxil ola bilməzsiniz.
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION