JavaRush /Java Blog /Random-ID /9 hal tentang NULL di Jawa
Sdu
Level 17

9 hal tentang NULL di Jawa

Dipublikasikan di grup Random-ID
Java dan null berjalan beriringan. Hampir tidak ada programmer Java yang tidak menemukan " pengecualian penunjuk nol " dan itu adalah fakta yang menyedihkan. Bahkan penemu konsep "null" menyebutnya sebagai kesalahan miliaran dolar, lalu mengapa Java mendukungnya? null sudah lama ada di sini, dan saya rasa pembuat Java tahu bahwa Java lebih banyak menimbulkan masalah daripada menyelesaikannya, jadi mengapa mereka masih menahannya. Dan ini lebih mengejutkan saya karena filosofi Java adalah menyederhanakan banyak hal, itulah sebabnya mereka tidak lagi dipusingkan dengan pointer, kelebihan operator, dan pewarisan ganda, tetapi mengapa null? 9 hal tentang NULL di Java - 1Ya, saya tidak begitu tahu jawaban atas pertanyaan itu, tapi yang saya tahu adalah tidak peduli seberapa banyak null dikritik oleh pemrogram Java dan komunitas sumber terbuka, kita harus menerimanya. Daripada menyesal, lebih baik pelajari lebih lanjut dan pastikan kita menggunakan null dengan benar.

Mengapa Anda harus mempelajari null di Java?

Karena jika Anda tidak memperhatikan null, Anda dapat yakin bahwa Java akan membuat Anda sangat menderita java.lang.NullPointerExceptiondan Anda akan mendapat pelajaran, tetapi Anda akan menempuh jalan yang sulit. Menulis kode anti-crash adalah sebuah seni dan tim Anda, pelanggan, dan pengguna akan menghargainya. Menurut pengalaman saya, salah satu alasan utamanya NullPointerExceptionadalah kurangnya pengetahuan tentang null di Java. Banyak dari Anda yang sudah familiar dengan null, sisanya akan dapat mempelajari beberapa hal lama dan baru tentang kata kunci null. Mari kita review atau pelajari beberapa hal penting tentang null di Java.

Apa yang null di Jawa

Seperti yang saya katakan, null adalah konsep yang sangat, sangat penting di Java. Awalnya diciptakan untuk menunjukkan tidak adanya sesuatu, seperti tidak adanya pengguna, sumber daya, atau apa pun, namun telah membingungkan pemrogram Java dengan banyak hal null pointer exception. Dalam tutorial ini, kita akan mempelajari fakta dasar tentang kata kunci null di Java, dan mempelajari beberapa trik untuk menghindari masalah null pointer exceptionsdan meminimalkan pemeriksaan null.
  1. Hal pertama yang pertama, null adalah kata kunci di Java, sama seperti public, staticatau final. Huruf besar-kecil bersifat sensitif, Anda tidak dapat menulis null sebagai Null atau NULL, kompiler tidak akan mengenalinya dan kesalahan akan terjadi.

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

    Hal ini sering ditemui oleh programmer yang telah beralih dari bahasa pemrograman lain, namun ketika menggunakan IDE modern, masalahnya menjadi tidak signifikan. Saat ini, IDE seperti Eclipse atau NetBeans dapat memperbaiki kesalahan ini saat Anda mengetik, namun di era Notepad, Vim, dan Emacs, ini adalah masalah umum yang dapat menghabiskan banyak waktu 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)

    Kode ini terlihat sangat sederhana dan tidak berbahaya. Anda cukup menghitung berapa kali suatu angka muncul dalam array, sebuah teknik klasik untuk menemukan duplikat. Pengembang mengambil jumlah yang dihitung sebelumnya, menambahnya satu dan memasukkannya kembali ke dalam Map. Dia mungkin berpikir bahwa auto-boxing akan menangani konversi Integerke int, seperti halnya ketika metode dipanggil put(), tetapi dia lupa bahwa jika angkanya belum dihitung, metode get()akan mengembalikan HashMapnol, bukan nol, karena nilai default apakah Integer ini nol, bukan 0, dan tinju otomatis akan muncul null pointer exceptionketika mencoba mengonversi Integer ke variabel int.

  6. Operator instanceofakan mengembalikan false jika ada variabel referensi dengan nilai null atau null itu sendiri yang ditentukan 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 properti penting dari operator instanceofyang membuatnya berguna untuk menguji tipe gips.

  7. Anda tahu bahwa Anda tidak dapat memanggil metode non-statis pada variabel referensi nol, itu akan memanggil NullPointerException, tetapi Anda mungkin tidak tahu bahwa Anda dapat memanggil metode statis pada variabel referensi nol. Karena metode statis menggunakan pengikatan statis, mereka tidak membuangnya NullPointerException. Berikut ini contohnya:

    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 dapat meneruskan null sebagai parameter ke metode yang menerima tipe referensi apa pun, misalnya:

    public void print(Object obj)

    bisa disebut seperti

    print(null)

    Ini normal dari sudut pandang kompiler, tetapi perilaku selanjutnya sepenuhnya bergantung pada metode. Metode null-safe tidak akan melempar NullPointerException, tetapi akan keluar begitu saja. Jika logika bisnis memungkinkan, disarankan untuk menulis metode null-safe.

  9. Anda dapat membandingkan null menggunakan operator ==(sama dengan) dan !=(tidak sama), namun Anda tidak dapat menggunakannya dengan operator aritmatika atau logika lain seperti <(kurang dari) atau >(lebih besar dari). Tidak seperti SQL, Java null == nullakan mengembalikan nilai true seperti yang ditunjukkan di bawah ini:

    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 mendapatkan pengalaman dalam pemrograman Java dan menggunakan trik sederhana yang harus dihindari NullPointerException, Anda dapat membuat kode Anda aman. Karena null dapat diperlakukan sebagai nilai kosong atau tidak diinisialisasi, hal ini sering kali menjadi sumber kebingungan, oleh karena itu penting untuk mendokumentasikan perilaku suatu metode ketika nilai null dimasukkan. Ingatlah selalu, null adalah nilai default dari variabel referensi, dan Anda tidak dapat memanggil metode instance atau mengakses variabel instance menggunakan referensi null di Java.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION