JavaRush /จาวาบล็อก /Random-TH /คอฟฟี่เบรค #98 ข้อยกเว้น Nullpointer ใหม่ใน Java 17 ห...

คอฟฟี่เบรค #98 ข้อยกเว้น Nullpointer ใหม่ใน Java 17 หมายถึงอะไรใน Java

เผยแพร่ในกลุ่ม

ข้อยกเว้น Nullpointer ใหม่ใน Java 17

ที่มา: Dev.to นักพัฒนา Java ทุกคนควรรู้เกี่ยวกับการมีอยู่ของNullpointer Exceptionหรือ NPE ใหม่ใน Java 17 นี่เป็นสถานการณ์หนึ่งที่คุณควรพยายามป้องกันเสมอ บางครั้ง Nullpointer หมายความว่าคุณต้องแก้ไขโค้ดของคุณเพื่อค้นหาข้อบกพร่องเล็กๆ น้อยๆ คอฟฟี่เบรค #98  ข้อยกเว้น Nullpointer ใหม่ใน Java 17 <T> คืออะไร  ในชวา?  - 1NPE เป็นข้อยกเว้นรันไทม์ที่เกิดขึ้นเมื่อโค้ดของคุณต้องการใช้วัตถุหรือการอ้างอิงไปยังวัตถุที่มีค่า Null มันสามารถเกิดขึ้นได้หากไม่มีการกำหนดค่าหรือวัตถุไม่มีการอ้างอิง ก่อน OpenJDK เวอร์ชันล่าสุด (เวอร์ชัน 17) ข้อยกเว้น Nullpointer ปกติในการติดตามสแต็กจะมีลักษณะดังนี้:
java.lang.NullPointerException: null
แน่นอนว่านั่นไม่ใช่ทั้งหมดที่คุณต้องรู้เกี่ยวกับสแต็กเทรซ อย่างที่คุณเห็น ไม่ได้ระบุว่าข้อยกเว้นนี้เกิดขึ้นที่ไหนหรือเพราะเหตุใด ดูว่า Java 17 จัดการกับปัญหานี้อย่างไร:
Exception in thread "main" java.lang.NullPointerException:
Cannot assign field "i" because "a" is null
at Prog.main(Prog.java:5)
ในตัวอย่างนี้ ข้อยกเว้นจะระบุว่าการอ้างอิงอ็อบเจ็กต์ null ของเราอยู่ที่ไหนและอะไร มันง่ายมาก!

<T> หมายถึงอะไรใน Java?

ที่มา: Dev.to <T>เป็นตัวอักษรทั่วไปที่ย่อมาจาก “Type” และอ้างอิงถึงแนวคิดทั่วไปใน Java คุณสามารถใช้ตัวอักษรอื่นสำหรับสิ่งนี้ แต่อย่างที่คุณเห็น ตัวอักษร T จะดีกว่า คอฟฟี่เบรค #98  ข้อยกเว้น Nullpointer ใหม่ใน Java 17 <T> คืออะไร  ในชวา?  - 2

ทั่วไปคืออะไร?

Generic เป็นวิธีการกำหนดพารามิเตอร์คลาส วิธีการ หรืออินเทอร์เฟซ ลองดูตัวอย่างทั่วไป:
package Generics;

class House<T>{

    T doorNumber;

    public House(T doorNumber) {
        this.doorNumber = doorNumber;
    }

    public void print(){
        System.out.println("Your house number is: " + this.doorNumber);
    }
}
  • เรามีคลาสที่เรียกว่าHouseซึ่งสามารถรับประเภทอ็อบเจ็กต์ตามอำเภอใจได้
  • ต่อไปเราจะมีฟิลด์ชื่อdoorNumberซึ่งสามารถรับวัตถุประเภทใดก็ได้
  • ในตอนท้าย เราจะประกาศ Constructor แบบกำหนดพารามิเตอร์และพิมพ์หมายเลขประตู
พูดง่ายๆ ก็คือ ผู้ใช้สามารถตัดสินใจได้ว่าตัวเลขนี้เป็นจำนวนเต็ม สตริง ลอย และอื่นๆ หมายเหตุ: คุณสามารถใช้ได้เฉพาะObjects . ไม่รองรับประเภทดั้งเดิมเนื่องจากข้อมูลทั่วไปมีไว้เพื่อใช้ในเวลาคอมไพล์ เมื่อเราใช้ Generics Tจะแทนที่สิ่งใดก็ตามที่สามารถขยาย คลาส Object ได้ และ primitives จะไม่มีคุณสมบัตินี้ สมมติว่าเราต้องการให้doorNumberเป็นสตริง
public class GenericsExample {
    public static void main(String[] args) {
        House<String> mainHouse = new House<>("14a");
        mainHouse.print();

    }
}
ผลลัพธ์จะมีลักษณะดังนี้:
บ้านเลขที่ของคุณคือ: 14a
เราจะแทนที่ตัวอักษร "T" ด้วย "String" และป้อนหมายเลขบ้านลงในตัวสร้าง เราสามารถใช้หลายประเภทได้ ตัวอย่างเช่น เราต้องการคลาสเพื่อยอมรับวัตถุมากกว่าหนึ่งชิ้น เราสามารถเพิ่มตัวอักษรอีกตัวและพูดว่า: เราต้องการให้ชั้นเรียนยอมรับ Generic ตัวอื่น
package Generics;

class House<T, V>{

    T doorNumber;
    V streetName;

    public House(T doorNumber, V streetName) {
        this.doorNumber = doorNumber;
        this.streetName = streetName;
    }

    public void print(){
        System.out.println("You live at: " + this.doorNumber + " " + this.streetName);
    }
}

public class GenericsExample {
    public static void main(String[] args) {
        House<Integer, String> mainHouse = new House<>(14, "Tellson Avenue");
        mainHouse.print();

    }
}
ผลลัพธ์จะเป็นดังนี้:
คุณอาศัยอยู่ที่: 14 Tellson Avenue
จนถึงตอนนี้เราได้เห็นตัวอย่างการใช้งาน Generic ในระดับชั้นเรียนแล้ว แต่เรายังสามารถมีวิธีและอินเทอร์เฟซทั่วไปได้

วิธีการทั่วไป

package Generics;

class House{

    public <T> void print(T doorNumber){
        System.out.println("You live at house number: " + doorNumber);
    }

}

public class GenericsExample {
    public static void main(String[] args) {
        House mainHouse = new House();
        mainHouse.<Integer>print(14);

    }
}
เมธอดนี้ยอมรับวัตถุ ประเภท ใดก็ได้และส่งออกหมายเลขประตู ซึ่งจะเป็นประเภทใดก็ได้ของObject ในกรณีนี้เราต้องการให้เมธอดยอมรับจำนวนเต็ม ผลลัพธ์จะเป็น:
คุณอาศัยอยู่ที่บ้านเลขที่: 14

อินเทอร์เฟซทั่วไป

ขั้นแรกให้สร้างอินเทอร์เฟซ
package Generics;

interface Property<T>{
    void hasBalcony(T balcony);
}
จากนั้นจึงนำอินเทอร์เฟซไปใช้
package Generics;

public class House implements Property<String> {

    @Override
    public void hasBalcony(String balcony) {
        System.out.println("Is there a balcony in the room? " + balcony);
    }

    public static void main(String[] args) {
        House mainHouse = new House();
        mainHouse.hasBalcony("YES");
    }

}
ผลลัพธ์:
มีระเบียงในห้องไหม? ใช่
ข้อดีของการใช้ยาสามัญคืออะไร?
  1. การตรวจสอบเวลาคอมไพล์ที่ดีกว่า : หากคุณใช้ประเภทอ็อบเจ็กต์อื่นนอกเหนือจากที่คุณระบุ คอมไพลเลอร์จะแจ้งให้คุณทราบ
  2. การนำกลับมาใช้ใหม่ : คุณสามารถใช้คลาส วิธีการ หรืออินเทอร์เฟซได้หลายครั้ง เนื่องจากคุณตัดสินใจว่าจะใช้ออบเจ็กต์ประเภทใด ขึ้นอยู่กับสิ่งที่คุณพยายามทำให้สำเร็จ
  3. เหมาะอย่างยิ่งสำหรับโครงสร้างข้อมูลและอัลกอริทึม : ArrayListและHashMapเป็นเพียงตัวอย่างบางส่วนที่ใช้ Generic
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION