JavaRush /Blog Java /Random-MS /9 perkara tentang NULL di Jawa
Sdu
Tahap

9 perkara tentang NULL di Jawa

Diterbitkan dalam kumpulan
Java dan null berjalan seiring. Hampir tidak ada pengaturcara Java yang tidak menemui " pengecualian penunjuk nol " dan itu adalah fakta yang menyedihkan. Malah pencipta konsep "null" menyebutnya kesilapan bilion dolarnya, maka mengapa Java menyokongnya? null telah lama berada di sini, dan saya rasa pencipta Java tahu bahawa ia mencipta lebih banyak masalah daripada menyelesaikannya, jadi mengapa mereka masih bersabar dengannya. Dan ini lebih mengejutkan saya kerana falsafah Java adalah untuk memudahkan perkara, itulah sebabnya mereka tidak bermain-main dengan petunjuk, beban berlebihan operator dan warisan berbilang lagi, tetapi mengapa batal? 9 perkara tentang NULL dalam Java - 1Baiklah, saya tidak benar-benar tahu jawapan kepada soalan itu, tetapi apa yang saya tahu ialah tidak kira berapa banyak null dikritik oleh pengaturcara Java dan komuniti sumber terbuka, kita harus hidup dengannya. Daripada menyesal, lebih baik untuk mengetahui lebih lanjut dan pastikan kami menggunakan null dengan betul.

Mengapa anda perlu belajar tentang null di Jawa?

Kerana jika anda tidak memberi perhatian kepada null, anda boleh yakin bahawa Java akan membuat anda menderita dengan cara yang teruk java.lang.NullPointerExceptiondan anda akan belajar pelajaran anda, tetapi anda akan pergi dengan cara yang sukar. Menulis kod tahan ranap adalah satu seni dan pasukan, pelanggan dan pengguna anda akan menghargainya. Dalam pengalaman saya, salah satu sebab utama NullPointerExceptionialah kekurangan pengetahuan tentang null di Jawa. Ramai daripada anda sudah biasa dengan null, anda yang lain akan dapat mempelajari beberapa perkara lama dan baharu tentang kata kunci null. Mari semak atau pelajari beberapa perkara penting tentang null di Jawa.

Apakah null di Jawa

Seperti yang saya katakan, null adalah konsep yang sangat, sangat penting di Jawa. Ia pada asalnya dicipta untuk menunjukkan ketiadaan sesuatu, seperti ketiadaan pengguna, sumber, atau apa sahaja, tetapi telah membingungkan pengaturcara Java dengan banyak null pointer exception. Dalam tutorial ini, kami akan mempelajari fakta asas tentang kata kunci nol dalam Java dan mempelajari beberapa helah untuk mengelakkan masalah null pointer exceptionsdan meminimumkan semakan nol.
  1. Perkara pertama dahulu, null ialah kata kunci dalam Java, sama seperti public, staticatau final. Kes adalah sensitif, anda tidak boleh menulis null sebagai Null atau NULL, pengkompil tidak akan mengenalinya dan ralat akan dilemparkan.

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

    Selalunya, pengaturcara yang telah beralih daripada bahasa pengaturcaraan lain menghadapi masalah ini, tetapi apabila menggunakan IDE moden, masalahnya menjadi tidak penting. Hari ini, IDE seperti Eclipse atau NetBeans boleh membetulkan ralat ini semasa anda menaip, tetapi dalam era Notepad, Vim dan Emacs, ini adalah masalah biasa yang boleh memakan banyak masa berharga.

  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)

    Kod ini kelihatan sangat mudah dan tidak berbahaya. Anda hanya mengira berapa kali nombor muncul dalam tatasusunan, teknik klasik untuk mencari pendua. Pembangun mengambil kuantiti yang dikira sebelumnya, meningkatkannya dengan satu dan memasukkannya semula ke dalam Map. Dia mungkin berfikir bahawa auto-tinju akan menguruskan penukaran Integerkepada int, seperti yang dilakukan apabila kaedah dipanggil put(), tetapi dia terlupa bahawa jika nombor itu belum lagi dikira, kaedah itu get()akan mengembalikan HashMapnol, bukan sifar, kerana nilai lalai ialah Integer ini adalah null, bukan 0, dan auto-boxing akan membuang null pointer exceptionapabila cuba menukar Integer kepada pembolehubah int.

  6. Operator instanceofakan mengembalikan palsu jika mana-mana pembolehubah rujukan dengan nilai null atau null itu sendiri dinyatakan sebagai parameter. Contoh:

    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

    Ini adalah sifat penting pengendali instanceofyang menjadikannya berguna untuk ujian jenis tuangan.

  7. Anda tahu bahawa anda tidak boleh memanggil kaedah bukan statik pada pembolehubah rujukan null, ia akan memanggil NullPointerException, tetapi anda mungkin tidak tahu bahawa anda boleh memanggil kaedah statik pada pembolehubah rujukan null. Kerana kaedah statik menggunakan pengikatan statik, mereka tidak membuang NullPointerException. Berikut ialah contoh:

    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. Anda boleh menghantar null sebagai parameter kepada kaedah yang menerima sebarang jenis rujukan, contohnya:

    public void print(Object obj)

    boleh dipanggil seperti

    print(null)

    Ini adalah perkara biasa dari sudut pandangan pengkompil, tetapi tingkah laku seterusnya bergantung sepenuhnya pada kaedah. Kaedah selamat-null tidak akan membuang NullPointerException, tetapi hanya akan keluar dengan anggun. Jika logik perniagaan membenarkan, adalah disyorkan untuk menulis kaedah selamat nol.

  9. Anda boleh membandingkan null menggunakan pengendali ==(sama) dan !=(tidak sama), tetapi anda tidak boleh menggunakannya dengan pengendali aritmetik atau logik lain seperti <(kurang daripada) atau >(lebih besar daripada). Tidak seperti SQL, Java null == nullakan kembali benar seperti yang ditunjukkan di bawah:

    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
Ini semua tentang null di Jawa. Dengan memperoleh sedikit pengalaman dalam pengaturcaraan Java dan menggunakan helah mudah untuk mengelakkan NullPointerException, anda boleh menjadikan kod anda selamat. Kerana null boleh dianggap sebagai nilai kosong atau tidak dimulakan, ini selalunya menjadi punca kekeliruan, itulah sebabnya penting untuk mendokumentasikan gelagat sesuatu kaedah apabila nilai nol dimasukkan. Sentiasa ingat, null ialah nilai lalai pembolehubah rujukan, dan anda tidak boleh memanggil kaedah contoh atau mengakses pembolehubah contoh menggunakan rujukan nol dalam Java.
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION