ข้อยกเว้น Nullpointer ใหม่ใน Java 17
ที่มา: Dev.to นักพัฒนา Java ทุกคนควรรู้เกี่ยวกับการมีอยู่ของNullpointer Exceptionหรือ NPE ใหม่ใน Java 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 จะดีกว่า
ทั่วไปคืออะไร?
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 แบบกำหนดพารามิเตอร์และพิมพ์หมายเลขประตู
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");
}
}
ผลลัพธ์:
มีระเบียงในห้องไหม? ใช่
ข้อดีของการใช้ยาสามัญคืออะไร?
- การตรวจสอบเวลาคอมไพล์ที่ดีกว่า : หากคุณใช้ประเภทอ็อบเจ็กต์อื่นนอกเหนือจากที่คุณระบุ คอมไพลเลอร์จะแจ้งให้คุณทราบ
- การนำกลับมาใช้ใหม่ : คุณสามารถใช้คลาส วิธีการ หรืออินเทอร์เฟซได้หลายครั้ง เนื่องจากคุณตัดสินใจว่าจะใช้ออบเจ็กต์ประเภทใด ขึ้นอยู่กับสิ่งที่คุณพยายามทำให้สำเร็จ
- เหมาะอย่างยิ่งสำหรับโครงสร้างข้อมูลและอัลกอริทึม : ArrayListและHashMapเป็นเพียงตัวอย่างบางส่วนที่ใช้ Generic
GO TO FULL VERSION