JavaRush /Java blogi /Random-UZ /Java'da NULL haqida 9 ta narsa
Sdu
Daraja

Java'da NULL haqida 9 ta narsa

Guruhda nashr etilgan
Java va null bir-biriga mos keladi. " Nul ko'rsatkichdan istisno " ga duch kelmagan Java dasturchisi deyarli yo'q va bu achinarli fakt. Hatto "null" kontseptsiyasining ixtirochisi buni o'zining milliard dollarlik xatosi deb atagan, unda nima uchun Java uni qo'llab-quvvatlaydi? null bu yerda uzoq vaqtdan beri mavjud va menimcha, Java yaratuvchilari u hal qilishdan ko'ra ko'proq muammolarni keltirib chiqarishini bilishadi, shuning uchun nima uchun ular hali ham bunga chidashmoqda. Va bu meni yanada hayratda qoldiradi, chunki Java falsafasi narsalarni soddalashtirish edi, shuning uchun ular endi ko'rsatkichlar, operatorning haddan tashqari yuklanishi va bir nechta meros bilan aralashmaydi, lekin nega null? Java'da NULL haqida 9 ta narsa - 1Xo'sh, men bu savolga javobni bilmayman, lekin men bilgan narsa shundaki, Java dasturchilari va ochiq manbalar hamjamiyati tomonidan qanchalik null tanqid qilinmasin, biz u bilan yashashimiz kerak. Afsuslanish o'rniga, ko'proq ma'lumotga ega bo'lgan ma'qul va nulldan to'g'ri foydalanishimizga ishonch hosil qilgan ma'qul.

Nima uchun Java'da null haqida bilishingiz kerak?

Chunki null ga e'tibor bermasangiz, Java sizni dahshatli tarzda qiynab qo'yishiga java.lang.NullPointerExceptionva saboq olishingizga ishonchingiz komil bo'ladi, lekin siz qiyin yo'ldan borasiz. Buzilishlarga chidamli kod yozish - bu san'at va sizning jamoangiz, mijozlaringiz va foydalanuvchilar buni qadrlashadi. Mening tajribamga ko'ra, asosiy sabablardan biri NullPointerExceptionJava'da null haqida ma'lumot etishmasligidir. Ko'pchiligingiz null bilan allaqachon tanishsiz, qolganlaringiz null kalit so'zi haqida eski va yangi narsalarni o'rganishingiz mumkin. Keling, Java-da null haqida ba'zi muhim narsalarni ko'rib chiqaylik yoki bilib olaylik.

Java'da null nima

Aytganimdek, null Java-da juda muhim tushunchadir. U dastlab biror narsaning yoʻqligini, masalan, foydalanuvchi, resurs yoki boshqa narsaning yoʻqligini koʻrsatish uchun ixtiro qilingan, biroq Java dasturchilarini juda koʻp null pointer exception. Ushbu o'quv qo'llanmada biz Java-dagi null kalit so'zi haqida asosiy faktlarni o'rganamiz va nosozliklarni oldini olish null pointer exceptionsva null tekshiruvlarini minimallashtirish uchun ba'zi bir fokuslarni o'rganamiz.
  1. Birinchidan, null Java tilidagi kalit so'zdir, xuddi public, staticyoki kabi final. Rejim sezgir, nullni Null yoki NULL deb yozish mumkin emas, kompilyator uni tanimaydi va xatolik yuz beradi.

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

    Bu ko'pincha boshqa dasturlash tillaridan o'tgan dasturchilar tomonidan uchraydi, ammo zamonaviy IDE-lardan foydalanganda muammo ahamiyatsiz bo'lib qoladi. Bugungi kunda Eclipse yoki NetBeans kabi IDElar siz yozish paytida ushbu xatoni tuzatishi mumkin, ammo Notepad, Vim va Emacs davrida bu juda ko'p qimmatli vaqtni talab qiladigan keng tarqalgan muammo edi.

  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)

    Ushbu kod juda oddiy va zararsiz ko'rinadi. Siz shunchaki raqam qatorda necha marta paydo bo'lishini hisoblaysiz, bu dublikatlarni topishning klassik usuli. Ishlab chiquvchi oldingi hisoblangan miqdorni oladi, uni bittaga oshiradi va uni yana ichiga kiritadi Map. U avtomatik boks usuli chaqirilganda bo'lgani kabi Integerga o'tkazish bilan shug'ullanadi deb o'ylashi mumkin , lekin agar raqam hali sanalmagan bo'lsa, usul nolga emas, null bo'lishini unutadi , chunki standart qiymat is Integer bu null, 0 emas, va avtomatik boks Integerni o'zgaruvchiga o'zgartirmoqchi bo'lganda o'chiriladi .intput()get()HashMapnull pointer exceptionint

  6. Agar parametr sifatida null yoki null qiymatiga ega bo'lgan har qanday mos yozuvlar o'zgaruvchisi ko'rsatilgan bo'lsa, operator instanceoffalse qaytaradi. Misol:

    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 operatorning muhim xususiyati bo'lib instanceof, uni turdagi castlarni sinash uchun foydali qiladi.

  7. Siz null mos yozuvlar o'zgaruvchisida statik bo'lmagan usulni chaqira olmasligingizni bilasiz, u ni chaqiradi NullPointerException, lekin siz null mos yozuvlar o'zgaruvchisida statik usulni chaqirishingiz mumkinligini bilmasligingiz mumkin. Chunki statik usullar statik ulanishdan foydalanadi, ular tashlab ketmaydi NullPointerException. Mana bir misol:

    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. Har qanday mos yozuvlar turini qabul qiladigan usulga parametr sifatida null ni o'tkazishingiz mumkin, masalan:

    public void print(Object obj)

    kabi deb atash mumkin

    print(null)

    Bu kompilyator nuqtai nazaridan normal holat, ammo keyingi xatti-harakatlar butunlay usulga bog'liq. Null-xavfsiz usul ni tashlamaydi NullPointerException, lekin shunchaki chiroyli tarzda chiqadi. Agar biznes mantig'i imkon bersa, null-xavfsiz usullarni yozish tavsiya etiladi.

  9. ==Nullni (teng) va (teng emas) operatorlari yordamida solishtirishingiz mumkin , lekin uni (kichik) yoki (kattaroq) !=kabi boshqa arifmetik yoki mantiqiy operatorlar bilan ishlata olmaysiz . SQL-dan farqli o'laroq, Java quyida ko'rsatilganidek, true qiymatini qaytaradi:<>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
Bu Java-da null haqida. Java dasturlashda biroz tajribaga ega bo'lish va oldini olish uchun oddiy fokuslardan foydalanish orqali NullPointerExceptionsiz kodingizni xavfsiz qilishingiz mumkin. Chunki null bo'sh yoki ishga tushirilmagan qiymat sifatida ko'rib chiqilishi mumkin, bu ko'pincha chalkashlik manbai bo'ladi, shuning uchun null qiymat kiritilganda usulning harakatini hujjatlashtirish muhimdir. Doimo esda tutingki, null mos yozuvlar oʻzgaruvchilarning standart qiymati boʻlib, siz Javaʼda null havolasi yordamida misol usullarini chaqira olmaysiz yoki misol oʻzgaruvchilariga kira olmaysiz.
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION