JavaRush /จาวาบล็อก /Random-TH /9 สิ่งเกี่ยวกับ NULL ใน Java
Sdu
ระดับ

9 สิ่งเกี่ยวกับ NULL ใน Java

เผยแพร่ในกลุ่ม
Javaและnullจับมือกัน แทบจะไม่มีโปรแกรมเมอร์ Java เลยที่ไม่พบ " ข้อยกเว้นตัวชี้โมฆะ " และนั่นเป็นข้อเท็จจริงที่น่าเศร้า แม้แต่ผู้ประดิษฐ์แนวคิด "null" ก็เรียกมันว่าความผิดพลาดมูลค่านับพันล้านดอลลาร์ของเขา แล้วทำไม Java ถึงสนับสนุนมัน? null อยู่ที่นี่มานานแล้ว และฉันเดาว่าผู้สร้าง Java รู้ดีว่ามันสร้างปัญหามากกว่าที่จะแก้ไข แล้วทำไมพวกเขาถึงยังทนกับมันอยู่ และสิ่งนี้ทำให้ฉันประหลาดใจมากยิ่งขึ้นเพราะปรัชญาของ Java คือการทำให้สิ่งต่าง ๆ ง่ายขึ้น ซึ่งเป็นสาเหตุที่ว่าทำไมพวกมันจึงไม่ยุ่งกับพอยน์เตอร์ การโอเวอร์โหลดของโอเปอเรเตอร์ และการสืบทอดหลายรายการอีกต่อไป แต่ทำไมถึงเป็นโมฆะ 9 สิ่งเกี่ยวกับ NULL ใน Java - 1ฉันไม่รู้คำตอบสำหรับคำถามนั้นจริงๆ แต่สิ่งที่ฉันรู้ก็คือไม่ว่าโปรแกรมเมอร์ Java และชุมชนโอเพ่นซอร์สจะวิพากษ์วิจารณ์ค่าว่างมากน้อยเพียงใด เราก็ต้องอยู่กับมัน แทนที่จะเสียใจ เป็นการดีกว่าที่จะเรียนรู้เพิ่มเติมและให้แน่ใจว่าเราใช้ null อย่างถูกต้อง

ทำไมคุณควรเรียนรู้เกี่ยวกับ null ใน Java?

เพราะถ้าคุณไม่ใส่ใจกับความว่างเปล่า คุณสามารถมั่นใจได้ว่า Java จะทำให้คุณทนทุกข์ทรมานอย่างสาหัสjava.lang.NullPointerExceptionและคุณจะได้บทเรียนของคุณ แต่คุณจะเลือกเส้นทางที่ยากขึ้น การเขียนโค้ดป้องกันการเสียหายถือเป็นศิลปะ และทีมงาน ลูกค้า และผู้ใช้ของคุณจะประทับใจกับมัน จากประสบการณ์ของผม สาเหตุหลักประการหนึ่งNullPointerExceptionคือการขาดความรู้เกี่ยวกับ null ใน Java หลายๆ คนคงคุ้นเคยกับ null อยู่แล้ว ส่วนคนอื่นๆ จะสามารถเรียนรู้สิ่งเก่าและใหม่เกี่ยวกับคีย์เวิร์ด null ได้ มาทบทวนหรือเรียนรู้สิ่งสำคัญบางประการเกี่ยวกับ null ใน Java กันดีกว่า

อะไรคือโมฆะใน Java

อย่างที่บอกไปแล้วว่า null เป็นแนวคิดที่สำคัญมากใน Java เดิมทีมันถูกประดิษฐ์ขึ้นเพื่อบ่งชี้ถึงการไม่มีบางสิ่งบางอย่าง เช่น การไม่มีผู้ใช้ ทรัพยากร หรืออะไรก็ตาม แต่ได้สร้างความสับสนให้กับโปรแกรมเมอร์ Java ด้วยnull pointer exception. ในบทช่วยสอนนี้ เราจะเรียนรู้ข้อเท็จจริงพื้นฐานเกี่ยวกับคีย์เวิร์ด null ใน Java และเรียนรู้เคล็ดลับบางประการเพื่อหลีกเลี่ยงปัญหาnull pointer exceptionsและลดการตรวจสอบค่า Null ให้เหลือน้อยที่สุด
  1. สิ่งแรกสุด null คือคีย์เวิร์ดใน Java เช่นเดียวกับpublic, staticหรือfinal. ตัวพิมพ์มีความละเอียดอ่อน คุณไม่สามารถเขียนค่าว่างเป็น Null หรือ NULL ได้ คอมไพเลอร์จะไม่รู้จักและจะเกิดข้อผิดพลาด

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

    บ่อยครั้งที่โปรแกรมเมอร์ที่เปลี่ยนจากภาษาโปรแกรมอื่นประสบปัญหานี้ แต่เมื่อใช้ IDE สมัยใหม่ปัญหาก็ไม่มีนัยสำคัญ ทุกวันนี้ IDE เช่น Eclipse หรือ NetBeans สามารถแก้ไขข้อผิดพลาดนี้ในขณะที่คุณพิมพ์ได้ แต่ในยุคของ 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)

    รหัสนี้ดูเรียบง่ายและไม่เป็นอันตราย คุณเพียงแค่นับจำนวนครั้งที่ตัวเลขปรากฏในอาร์เรย์ ซึ่งเป็นเทคนิคคลาสสิกในการค้นหาค่าซ้ำ นักพัฒนานำปริมาณที่นับไว้ก่อนหน้านี้ เพิ่มขึ้นทีละหนึ่งแล้วแทรกกลับเข้าไปMapใน เขาอาจคิดว่า auto-boxing จะดูแลการแปลงIntegerเป็นintเช่นเดียวกับที่ทำเมื่อมีการเรียกเมธอดput()แต่เขาลืมไปว่าหากยังไม่นับจำนวน เมธอดget()จะส่งกลับHashMapค่าว่าง ไม่ใช่ศูนย์ เนื่องจากค่าเริ่มต้นเป็นค่าเริ่มต้น เป็น Integer นี่คือ null ไม่ใช่ 0 และการชกมวยอัตโนมัติจะเกิดขึ้นnull pointer exceptionเมื่อพยายามแปลง Integer เป็นตัวแปรint

  6. ตัวดำเนินการinstanceofจะส่งคืนค่าเท็จหากมีการระบุตัวแปรอ้างอิงใดๆ ที่มีค่าเป็น null หรือ null นั้นเป็นพารามิเตอร์ ตัวอย่าง:

    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)

    นี่เป็นเรื่องปกติจากมุมมองของคอมไพลเลอร์ แต่ลักษณะการทำงานที่ตามมาจะขึ้นอยู่กับวิธีการทั้งหมด วิธีการที่ปลอดภัยแบบ 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 โปรดจำไว้เสมอว่า null คือค่าเริ่มต้นของตัวแปรอ้างอิง และคุณไม่สามารถเรียกใช้เมธอดอินสแตนซ์หรือเข้าถึงตัวแปรอินสแตนซ์โดยใช้การอ้างอิง null ใน Java ได้
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION