JavaRush /Java блогу /Random-KY /Javaдагы NULL жөнүндө 9 нерсе
Sdu
Деңгээл

Javaдагы NULL жөнүндө 9 нерсе

Группада жарыяланган
Java жана null бири-бирине окшош. " Нөл көрсөткүчүн эске албаганда" учурабаган Java программисти дээрлик жок жана бул өкүнүчтүү чындык. Атүгүл "нөлдүк" концепциянын ойлоп табуучусу муну өзүнүн миллиард долларлык катасы деп атады, анда эмне үчүн Java аны колдойт? null бул жерде көптөн бери бар, менимче, Java түзүүчүлөрү ал чечкенге караганда көбүрөөк көйгөйлөрдү жаратаарын бorшет, андыктан эмне үчүн алар дагы эле чыдап жатышат. Бул мени ого бетер таң калтырды, анткени Java философиясы нерселерди жөнөкөйлөштүрүү болуп саналат, ошондуктан алар көрсөткүчтөр, оператордун ашыкча жүктөлүшү жана көп мурастоо менен аралашпайт, бирок эмне үчүн нөл? Javaдагы NULL жөнүндө 9 нерсе - 1Ооба, мен бул суроонун жообун билбейм, бирок мен билген нерсе, Java программисттери жана ачык булак коомчулугу тарабынан канчалык нөлдү сынга алышпасын, биз аны менен жашашыбыз керек. Өкүнгөндүн ордуна, көбүрөөк бorп, нөлдү туура колдонгонубузга ишенгенибиз жакшы.

Эмне үчүн Javaдагы null жөнүндө бorшиңиз керек?

Анткени нөлгө көңүл бурбасаңыз, Java сизди коркунучтуу түрдө азапка салат java.lang.NullPointerExceptionжана сабак алып каласыз, бирок сиз кыйын жол менен кетесиз. Кырсыкка чыдамдуу code жазуу - бул искусство жана сиздин командаңыз, кардарларыңыз жана колдонуучуларыңыз аны баалайт. Менин тажрыйбамда, негизги себептердин бири NullPointerExceptionJava тorнде null жөнүндө бorмдин жоктугу. Сиздердин көбүңүздөр null менен таанышсыңар, калгандарыңар null ачкыч сөзү жөнүндө эски жана жаңы нерселерди биле алышат. Келгиле, Javaдагы null жөнүндө кээ бир маанилүү нерселерди карап көрөлү же үйрөнөлү.

Javaда нөл деген эмне

Мен айткандай, null Java тorнде абдан маанилүү түшүнүк. Бул алгач колдонуучунун, ресурстун же башкалардын жоктугу сыяктуу бир нерсенин жоктугун көрсөтүү үчүн ойлоп табылган, бирок Java программисттерин null pointer exception. Бул окуу куралында биз Java тorндеги нөл ачкыч сөзү жөнүндө негизги фактыларды үйрөнөбүз жана null pointer exceptionsнөл чектерин азайтуу жана көйгөйлөрдөн качуу үчүн кээ бир амалдарды үйрөнөбүз.
  1. Биринчиден, null бул Java тorндеги ачкыч сөз, publicже staticсыяктуу final. Регистр сезимтал, сиз нөлдү Null же NULL деп жаза албайсыз, компилятор аны тааныbyte жана ката кетип калат.

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

    Буга көп учурда башка программалоо тилдеринен өткөн программисттер туш болушат, бирок заманбап IDEлерди колдонууда көйгөй анчалык деле байкалбай калат. Ушул күндөрү, Eclipse же NetBeans сыяктуу IDEтер сиз терип жатканда бул катаны оңдой алат, бирок 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. Выполнение 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Ал авто-бокс ге конвертациялоонун камын көрөт деп ойлошу мүмкүн int, бирок бул ыкма чакырылганда болот put(), бирок ал унутуп калат, эгерде сан али санала элек болсо, ыкма нөл эмес, нөлгө барабар get()болот HashMap, анткени демейки маани is Integer бул 0 эмес, нөл жана null pointer exceptionбүтүн санды өзгөрмөгө айландыруу аракетинде автобокс ыргытат int.

  6. instanceofЭгерде параметр катары null же null мааниси бар кандайдыр бир шилтеме өзгөрмөсү көрсөтүлсө, оператор false кайтарып берет. Мисал:

    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
Мунун баары Javaдагы null жөнүндө. Java программалоодо кандайдыр бир тажрыйбага ээ болуу жана алдын алуу үчүн жөнөкөй амалдарды колдонуу менен NullPointerException, сиз codeуңузду коопсуз кыла аласыз. Анткени null бош же башталбаган маани катары каралышы мүмкүн, бул көбүнчө башаламандыктын булагы болуп саналат, ошондуктан нөл мааниси киргизилгенде методдун жүрүм-турумун documentтештирүү маанилүү. Дайыма эсиңизде болсун, null шилтеме өзгөрмөлөрүнүн демейки мааниси, жана сиз Java'дагы нөл шилтемени колдонуп инстанция ыкмаларын же инстанция өзгөрмөлөрүнө кире албайсыз.
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION