JavaRush /Java блогы /Random-KK /Java тіліндегі NULL туралы 9 нәрсе
Sdu
Деңгей

Java тіліндегі NULL туралы 9 нәрсе

Топта жарияланған
Java және null қатар жүреді. « Нөлдік көрсеткішті ерекшелеуге » тап болмаған Java бағдарламашысы жоқ және бұл қайғылы факт. Тіпті «нөлдік» концепцияның өнертапқышы оны өзінің миллиард долларлық қатесі деп атады, сонда Java оны неге қолдайды? null ұзақ уақыт бойы осында болды, және менің ойымша, Java-ны жасаушылар оның шешкеннен гөрі көп мәселелер тудыратынын біледі, сондықтан олар неге әлі де шыдап отыр. Бұл мені одан сайын таң қалдырады, өйткені Java философиясы нәрселерді жеңілдету болды, сондықтан олар көрсеткіштермен, оператордың шамадан тыс жүктелуімен және бірнеше мұрагерлікпен араласпайды, бірақ неге нөл? Java тіліндегі NULL туралы 9 нәрсе - 1Мен бұл сұрақтың жауабын шынымен білмеймін, бірақ мен білетін нәрсе - Java бағдарламашылары мен ашық бастапқы қауымдастық қанша нөлді сынаса да, біз онымен өмір сүруіміз керек. Өкінудің орнына, көбірек біліп, нөлді дұрыс қолданатынымызға сенімді болған дұрыс.

Неліктен Java тіліндегі null туралы білу керек?

Өйткені нөлге назар аудармасаңыз, Java сізді қорқынышты түрде қинайтынына java.lang.NullPointerExceptionжәне сіз өз сабағыңызды алатыныңызға сенімді бола аласыз, бірақ сіз қиын жолмен кетесіз. Апатқа төзімді code жазу - бұл өнер және сіздің командаңыз, тұтынушыларыңыз және пайдаланушылар оны бағалайды. Менің тәжірибемде басты себептердің бірі NullPointerExceptionJava тіліндегі null туралы білімнің болмауы. Сіздердің көпшілігіңіз null-мен бұрыннан таныссыз, қалғандарың null кілт сөзі туралы ескі және жаңа нәрселерді біле аласыз. Java тіліндегі null туралы кейбір маңызды нәрселерді қарастырайық немесе білейік.

Java тілінде нөл деген не

Мен айтқанымдай, null Java тілінде өте маңызды ұғым. Ол бастапқыда пайдаланушының, ресурстың немесе басқалардың жоқтығы сияқты бірдеңенің жоқтығын көрсету үшін ойлап табылған, бірақ Java бағдарламашыларын көптеген null pointer exception. Бұл оқулықта біз Java тіліндегі нөлдік кілт сөз туралы негізгі фактілерді үйренеміз және null pointer exceptionsнөлдік тексерулермен қиындықтарды болдырмау және азайту үшін кейбір амалдарды үйренеміз.
  1. Біріншіден, null - Java тіліндегі кілт сөз, , publicнемесе staticсияқты final. Регистр сезімтал, null мәнін Null немесе NULL деп жаза алмайсыз, компилятор оны танымайды және қате жіберіледі.

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

    Бұл басқа бағдарламалау тілдерінен ауысқан бағдарламашыларда жиі кездеседі, бірақ қазіргі заманғы IDE пайдалану кезінде мәселе елеусіз болады. Бұл күндері Eclipse немесе NetBeans сияқты IDE теру кезінде бұл қатені түзете алады, бірақ Блокнот, 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. Выполнение 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)

    Бұл code өте қарапайым және зиянсыз көрінеді. Сіз жай ғана санның массивте қанша рет пайда болатынын санайсыз, бұл көшірмелерді табудың классикалық әдісі. Әзірлеуші ​​алдыңғы есептелген шаманы алады, оны бір көбейтеді және оны қайтадан ішіне енгізеді Map. Ол әдіс шақырылған кездегідей автобокс түрлендіруге қамқорлық жасайды деп ойлауы мүмкін Integer, бірақ ол егер сан әлі есептелмеген болса, әдіс нөлді емес, нөлді қайтаратынын ұмытады , себебі әдепкі мән is Integer бұл 0 емес, нөл, және Integer айнымалысына түрлендіру әрекеті кезінде автобокс орындалады .intput()get()HashMapnull pointer exceptionint

  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)

    Бұл компилятордың көзқарасы бойынша қалыпты жағдай, бірақ кейінгі әрекет толығымен әдіске байланысты. Нөлдік қауіпсіз әдіс throw болмайды NullPointerException, бірақ жай ғана әдемі түрде шығады. Іскерлік логика рұқсат етсе, нөлдік қауіпсіз әдістерді жазу ұсынылады.

  9. ==Нөлді (тең) және (тең емес) операторлары арқылы салыстыруға болады , бірақ оны (кіші) немесе (үлкен) !=сияқты басқа арифметикалық немесе логикалық операторлармен пайдалана алмайсыз . SQL-тен айырмашылығы, Java төменде көрсетілгендей true мәнін қайтарады:<>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
Мұның бәрі Java-дағы null туралы. Java бағдарламалауында біраз тәжірибе жинақтау және оны болдырмау үшін қарапайым амалдарды қолдану арқылы NullPointerExceptioncodeыңызды қауіпсіз ете аласыз. Өйткені null бос немесе инициализацияланбаған мән ретінде қарастырылуы мүмкін, бұл жиі шатасудың көзі болып табылады, сондықтан нөлдік мән енгізілген кезде әдіс әрекетін құжаттау маңызды. Әрқашан есте сақтаңыз, null анықтамалық айнымалы мәндердің әдепкі мәні болып табылады және сіз Java тіліндегі нөлдік сілтемені пайдаланып даналық әдістерге немесе даналық айнымалы мәндерге қол жеткізе алмайсыз.
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION