JavaRush /Блоги Java /Random-TG /9 чиз дар бораи NULL дар Java
Sdu
Сатҳи

9 чиз дар бораи NULL дар Java

Дар гурӯҳ нашр шудааст
Java ва null ба ҳам меоянд. Қариб ягон барномасози Java вуҷуд надорад, ки бо " истиснои нул нишондиҳанда " дучор наояд ва ин як далели ғамангез аст. Ҳатто ихтироъкори консепсияи "null" онро хатои миллиард доллари худ номид, пас чаро Java онро дастгирӣ мекунад? null муддати тӯлонӣ дар ин ҷо буд ва гумон мекунам, ки созандагони Java медонанд, ки он нисбат ба ҳалли он мушкилоти бештар эҷод мекунад, пас чаро онҳо то ҳол бо он таҳаммул мекунанд. Ва ин маро боз ҳам бештар ба ҳайрат меорад, зеро фалсафаи Java содда кардани чизҳо буд, аз ин рӯ онҳо дигар бо нишондиҳандаҳо, изофабори оператор ва мероси сершумор ошуфта намешаванд, аммо чаро нул? 9 чиз дар бораи NULL дар Java - 1Хуб, ман аслан ҷавоби ин саволро намедонам, аммо он чизе ки ман медонам, ин аст, ки новобаста аз он ки новобаста аз он ки барномасозони Java ва ҷомеаи кушодаасос интиқод мекунанд, мо бояд бо он зиндагӣ кунем. Ба ҷои пушаймон шудан, беҳтар аст, ки маълумоти бештар гиред ва боварӣ ҳосил кунед, ки мо нулро дуруст истифода мебарем.

Чаро шумо бояд дар бораи null дар Java омӯзед?

Зеро агар шумо ба нул аҳамият надиҳед, боварӣ ҳосил кунед, ки Java шуморо даҳшатнок мекунад java.lang.NullPointerExceptionва шумо дарси худро хоҳед гирифт, аммо шумо роҳи сахтро меравед. Навиштани рамзи ба садама тобовар як санъат аст ва дастаи шумо, муштариён ва корбарони шумо онро қадр хоҳанд кард. Дар таҷрибаи ман, яке аз сабабҳои асосӣ NullPointerExceptionин набудани дониш дар бораи null дар Java мебошад. Бисёре аз шумо аллакай бо null шинос ҳастед, дигарон метавонанд чизҳои кӯҳна ва навро дар бораи калимаи калидии null омӯзанд. Биёед баъзе чизҳои муҳимро дар бораи null дар Java баррасӣ кунем ё омӯзем.

Дар Java чӣ null аст

Тавре ки ман гуфтам, null консепсияи хеле муҳим дар Java аст. Он дар ибтидо барои нишон додани набудани чизе ихтироъ шуда буд, ба монанди набудани корбар, манба ё дигар, аммо барномасозони Java-ро бо миқдори зиёди null pointer exception. Дар ин дарс, мо далелҳои асосиро дар бораи калимаи калидии null дар Java меомӯзем ва баъзе ҳиллаҳоро барои пешгирӣ кардани мушкилот null pointer exceptionsва кам кардани чекҳои null меомӯзем.
  1. Аввалин чизест, ки null калимаи калидӣ дар Java аст, ба мисли public, staticё final. Регистр ҳассос аст, шумо null-ро ҳамчун Null ё NULL навишта наметавонед, компилятор онро эътироф намекунад ва хатогӣ содир мешавад.

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

    Зачастую, с этим встречаются программисты, перешедшие с других языков программирования, но при использовании современных IDE проблема становится незначительной. В наши дни, IDE вроде Eclipse or NetBeans могут исправлять эту ошибку пока Вы набираете code, но в эпоху Notepad, Vim и Emacs, это была распространенная проблема, которая могла съесть кучу драгоценного времени.

  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. Рамзи дар зер нишон додашуда баробари иҷро кардани он қатъ мегардад.

    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)

    Ин code хеле содда ва безарар менамояд. Шумо танҳо ҳисоб мекунед, ки рақам дар массив чанд маротиба пайдо мешавад, як усули классикии дарёфти такрорӣ. Таҳиягар миқдори қаблан ҳисобшударо гирифта, онро як маротиба зиёд мекунад ва дубора ба Map. IntegerВай шояд фикр кунад, ки автомат-бокс ба табдor int, мисли он вақте ки ин метод даъват карда мешавад put(), ғамхорӣ мекунад, аммо ӯ фаромӯш мекунад, ки агар рақам то ҳол ҳисоб карда нашуда бошад, усул нул get()бармегардад HashMap, на сифр, зеро арзиши пешфарз is Integer ин нул аст, на 0 ва null pointer exceptionҳангоми кӯшиши табдил додани адади бутун ба тағирёбанда худкор қуттӣ мепартояд int.

  6. Агар ягон тағирёбандаи истинод бо арзиши null ё null ҳамчун параметр муайян карда шуда бошад, оператор instanceofхато бармегардонад. Мисол:

    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

    Ин як хосияти муҳими оператор аст instanceof, ки онро барои санҷиши навъҳои таркиш муфид мекунад.

  7. Шумо медонед, ки шумо наметавонед усули ғайристатикиро дар як тағирёбандаи истинодҳои нул даъват кунед, он -ро даъват мекунад NullPointerException, аммо шумо шояд намедонед, ки шумо метавонед усули статикиро дар тағирёбандаи истинодҳои нул даъват кунед. Зеро усулҳои статикӣ ҳатмии статикиро истифода мебаранд, онҳо намепартоянд NullPointerException. Инак як мисол:

    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. Шумо метавонед null -ро ҳамчун параметр ба усуле гузаронед, ки ҳама гуна намуди истинодро қабул мекунад, масалан:

    public void print(Object obj)

    монанди номидан мумкин аст

    print(null)

    Ин аз нуқтаи назари компилятор муқаррарӣ аст, аммо рафтори минбаъда комилан ба усул вобаста аст. Усули безарар нест, намепартояд NullPointerException, балки ба таври оддӣ берун мешавад. Агар мантиқи тиҷорӣ иҷозат диҳад, тавсия дода мешавад, ки усулҳои бехатарро нависед.

  9. Шумо метавонед нулро бо истифода аз операторҳои ==(баробар) ва !=(баробар) муқоиса кунед, аммо шумо онро бо дигар операторҳои арифметикӣ ё мантиқӣ, ба монанди <(камтар аз) ё >(бузургтар аз) истифода карда наметавонед. Баръакси SQL, Java, 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
Ин ҳама дар бораи null дар Java аст. Бо гирифтани каме таҷриба дар барномасозии Java ва истифодаи ҳиллаҳои оддӣ барои пешгирӣ кардани NullPointerException, шумо метавонед рамзи худро бехатар созед. Зеро null-ро метавон ҳамчун арзиши холӣ ё ибтидонашуда баррасӣ кард, ин аксар вақт манбаи нофаҳмиҳо аст, бинобар ин ҳуҷҷатгузорӣ кардани рафтори усул ҳангоми ворид кардани арзиши сифр муҳим аст. Ҳамеша дар хотир доред, ки null арзиши пешфарзии тағирёбандаҳои истинод аст ва шумо наметавонед ба усулҳои мисол занг занед ё бо истифода аз истинодҳои нул дар Java ба тағирёбандаҳои мисол дастрасӣ пайдо кунед.
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION