![เคล็ดลับและเคล็ดลับ วิธีหลีกเลี่ยง NullPointerException ในแอปพลิเคชัน Java - 1]()
วันนี้ฉันจะแสดงเทคนิคง่ายๆ เกี่ยวกับวิธีการหลีกเลี่ยง NullPointerException ในแอปพลิเคชันของคุณ ง่ายต่อการปฏิบัติตาม แต่ปรับปรุงความน่าเชื่อถือและคุณภาพของโค้ดของคุณได้อย่างมาก จากประสบการณ์ของผม เคล็ดลับแรกจะมีผลกระทบที่เห็นได้ชัดเจนต่อคุณภาพของโค้ดของคุณ หากคุณทราบเทคนิคการเขียนโปรแกรม Java อื่น ๆ โปรดแบ่งปันในความคิดเห็น
เรียกใช้เมธอดเท่ากับ () และเท่ากับ IgnoreCase() บนสตริงลิเทอรัลที่รู้จักแทนที่จะเป็นวัตถุที่ไม่รู้จัก
เรียกเมธอด
equals()
บนสตริงที่รู้จักซึ่งคุณรู้ว่าไม่ใช่
null
เสมอ วิธีการนี้
equals()
เป็นแบบสมมาตร นั่นคือการเรียก
a.equals(b)
และ
b.equals(a)
จะให้ผลลัพธ์เดียวกัน (ถ้าไม่ใช่
a
) และด้วยเหตุ นี้โปรแกรมเมอร์จำนวนมากจึงไม่ใส่ใจว่าวัตถุใดถูกเรียกy หรือ y ผลข้างเคียงอย่างหนึ่งของสิ่งนี้คือ NullPointerException หากมีการเรียกใช้เมธอดบน
b
null
equals()
a
b
null
Object unknownObject = null;
if(unknownObject.equals("knownObject")){
System.err.println("This may result in NullPointerException if unknownObject is null");
}
if("knownObject".equals(unknownObject)){
System.err.println("better coding avoided NullPointerException");
}
นี่เป็นเคล็ดลับที่ง่ายที่สุดในการหลีกเลี่ยง NullPointerException แต่เพียงอย่างเดียวก็ทำให้มีการปรับปรุงอย่างมากเนื่องจากวิธีนี้
equals()
พบได้ทุกที่
เลือก valueOf() มากกว่า toString() ในกรณีที่ทั้งคู่ให้ผลลัพธ์เหมือนกัน
เนื่องจากการเรียก
toString()
การอ้างอิงที่มีค่า ทำให้ เกิด
null
NullPointerException จึงควรใช้การเรียก
valueOf()
เมื่อเราได้ผลลัพธ์เดียวกัน เนื่องจากการเรียก
valueOf()
จาก
null
return โดยเฉพาะอย่างยิ่ง สำหรับคลาส
null
wrapper เช่น
Integer
,
Float
หรือ
Double
BigDecimal
BigDecimal bd = getPrice();
System.out.println(String.valueOf(bd));
System.out.println(bd.toString());
ใช้เคล็ดลับเหล่านี้เมื่อคุณไม่แน่ใจว่าวัตถุนั้นมีอยู่จริง
null
หรือไม่
ใช้null
วิธีและไลบรารี -safe
มีไลบรารีโอเพ่นซอร์สจำนวนมากที่รับภาระหนักในการทดสอบไฟล์
null
. หนึ่งในสิ่งที่พบมากที่สุดคือ
StringUtils
จาก Apache Commons โดยใช้วิธีการ ต่างๆเช่น
StringUtils.isBlank()
,
isNumeric()
ฯลฯ
isWhiteSpace()
คุณไม่ต้องกังวลกับการขว้าง NullPointerException
System.out.println(StringUtils.isEmpty(null));
System.out.println(StringUtils.isBlank(null));
System.out.println(StringUtils.isNumeric(null));
System.out.println(StringUtils.isAllUpperCase(null));
ผลลัพธ์:
true true false false และก่อนใช้งานอย่าลืมอ่านเอกสารประกอบ
null
ของวิธีการและคลาสที่ปลอดภัย นี่เป็นอีกหนึ่งเทคนิค Java ที่ดีที่สุดที่นำไปสู่การปรับปรุงครั้งใหญ่โดยไม่ต้องใช้ความพยายามมากนัก
พยายามอย่าส่งคืนnull
จากเมธอด จะเป็นการดีกว่าถ้าส่งคืนคอลเล็กชันว่าง
นี่เป็นเคล็ดลับการเขียนโปรแกรม Java ที่ดีอีกประการหนึ่งที่ Joshua Bloch อธิบายไว้ในหนังสือ Java: การเขียนโปรแกรมที่มีประสิทธิภาพ เมื่อส่งคืนคอลเลกชันหรืออาร์เรย์ว่าง ตรวจสอบให้แน่ใจว่าการเรียกเมธอดพื้นฐานชอบ
size()
หรือ
length()
ไม่ส่ง NullPointerException ชั้นเรียน ประกาศการใช้งาน ที่
Collections
สะดวกของรายการว่าง ชุด และพจนานุกรมโดยเฉพาะ:
Collections.EMPTY_LIST
และ ตัวอย่างเช่น:
Collections.EMPTY_SET
Collections.EMPTY_MAP
public List getOrders(Customer customer){
List result = Collections.EMPTY_LIST;
return result;
}
ในทำนองเดียวกัน คุณสามารถใช้
Collections.EMPTY_SET
มัน
Collections.EMPTY_MAP
แทนการส่งคืน
null
ได้
ใช้คำอธิบายประกอบ @NotNull และ @Nullable
ในคำอธิบายวิธีการของคุณ คุณสามารถกำหนด
null
แบบแผนความปลอดภัยของวิธีการได้โดยใช้คำอธิบายประกอบ
@NotNull
และ @Nullable เพื่อระบุว่าวิธีการสามารถส่งคืนได้
null
หรือไม่ คอมไพเลอร์และ IDE สมัยใหม่สามารถใช้คำอธิบายประกอบเหล่านี้เพื่อวิเคราะห์โค้ดของคุณและให้คำแนะนำที่เหมาะสม เช่น เกี่ยวกับการขาดการตรวจสอบ
null
หรือในทางกลับกัน เกี่ยวกับความเป็นไปได้ในการลบการตรวจสอบที่ไม่จำเป็นซึ่งอุดตันโค้ด ตัวอย่างเช่น คำอธิบายประกอบดังกล่าวได้รับการสนับสนุนโดย IntelliJ IDE และ FindBugs และรวมอยู่ใน JSR 305 ด้วย แต่แม้ว่า IDE ของคุณจะไม่รองรับคำอธิบายประกอบดังกล่าว แต่ก็ถือเป็นเอกสารที่ดีในตัวมันเอง เมื่อพิจารณาดู
@NotNull
แล้ว
@Nullable
มันจะง่ายกว่าสำหรับโปรแกรมเมอร์ที่จะเข้าใจว่าจะเพิ่มการตรวจสอบที่ไหน
null
และที่ไหนไม่ นี่เป็นแนวทางปฏิบัติที่ค่อนข้างใหม่ในหมู่โปรแกรมเมอร์ Java และจะต้องใช้เวลาในการแพร่กระจาย
หลีกเลี่ยงการทำ autoboxing และ autounboxing ที่ไม่จำเป็นในโค้ดของคุณ
สิ่งนี้ไม่เพียงนำไปสู่การสร้างวัตถุชั่วคราวที่ไม่จำเป็นเท่านั้น แต่การออโต้บ็อกซ์ยังสามารถส่ง NullPointerException ได้หากคลาส wrapper เป็น
null
.
null
ตัวอย่างเช่น รหัสต่อไป นี้ จะส่ง NullPointerException หากรายการบุคคลไม่มีหมายเลขโทรศัพท์และส่งกลับ
Person ram = new Person("ram");
int phone = ram.getPhone();
เมื่อใช้ autoboxing หรือ autounboxing ไม่เพียงแต่ความเท่าเทียมกันเท่านั้น แต่ยังรวมถึงความไม่เท่าเทียมกัน
<
>
>
อาจส่งผลให้เกิด NullPointerException
ปฏิบัติตามแบบแผนและกำหนดค่าเริ่มต้นที่สมเหตุสมผล
หนึ่งในวิธีที่ดีที่สุดในการหลีกเลี่ยง NullPointerException ใน Java คือการประกาศอย่างถูกต้องและปฏิบัติตามแบบแผนการเข้ารหัส NullPointerExceptions ส่วนใหญ่เกิดขึ้นเมื่อคุณพยายามสร้างวัตถุโดยไม่มีข้อมูลและการอ้างอิงทั้งหมดที่ต้องการ ด้วยการป้องกันการสร้างวัตถุที่ยังสร้างไม่เสร็จโดยการปฏิเสธคำขอดังกล่าว คุณจะรอดพ้นจาก NullPointerExceptions จำนวนมากในอนาคต ในทำนองเดียวกัน หากคุณอนุญาตให้สร้างออบเจ็กต์ คุณควรเลือกค่าเริ่มต้นที่สมเหตุสมผล ตัวอย่างเช่น ไม่สามารถสร้างคลาสอ็อบเจ็กต์
Employee
ได้หากไม่มีชื่อ และ
id
แต่อาจไม่มีหมายเลขโทรศัพท์ ในกรณีนี้ วัตถุ
Employee
ที่ไม่มีตัวเลขอาจส่งคืนศูนย์
null
แทน แม้ว่าควรพิจารณาพฤติกรรมดังกล่าวของวัตถุล่วงหน้า แต่การตรวจสอบอาจง่ายกว่าการ
null
โทรไปยังหมายเลขที่ไม่มีอยู่จริง ในกรณีนี้ การมีเงื่อนไขเพิ่มเติมว่าช่องใดเป็นช่องใด
null
และไม่ใช่ช่องใดจะช่วยให้ตัดสินใจได้ถูกต้อง โดยทั่วไป ทางเลือกระหว่างการหยุดทำงานของโปรแกรมทันทีหรือการกำหนดโปรแกรม
null
เป็นการตัดสินใจในการออกแบบที่สำคัญ และเมื่อคุณได้เลือกตัวเลือกแล้ว คุณจะต้องปฏิบัติตามอย่างสม่ำเสมอ
กำหนดข้อจำกัดในระดับ DBMS
เมื่อใช้ฐานข้อมูลเพื่อจัดเก็บออบเจ็กต์โปรแกรมของคุณ เช่น ลูกค้าหรือคำสั่งซื้อ ก็ควรที่จะระบุ "
null
ความเป็น" ของออบเจ็กต์ของคุณที่ระดับ DBMS โดยใช้ข้อจำกัดของตารางที่เหมาะสม ฐานข้อมูลมักจะมีข้อมูลจากหลายแหล่ง และการแนะนำการตรวจสอบค่าที่หายไปจะช่วยปรับปรุงความสมบูรณ์ของข้อมูลของคุณ นอกจากนี้ การมีอยู่ของการตรวจสอบค่าว่างในระดับ DBMS จะลดการตรวจสอบเหล่านี้ในโค้ด Java ของคุณ: โดยการโหลดข้อมูลจากฐานข้อมูลลงในออบเจ็กต์ Java คุณสามารถมั่นใจได้ว่ามีอยู่และลบ "
!= null
" ที่ไม่จำเป็นออกจากโค้ดโปรแกรม
ใช้รูปแบบวัตถุ Null
การสร้างพิเศษ
Null
-objects เป็นอีกวิธีหนึ่งในการหลีกเลี่ยง NullPointerExcpetion ใน Java สมมติว่าเมธอดบางอย่างในแอปพลิเคชันของเราส่งคืนออบเจ็กต์ที่โปรแกรมทำงานในภายหลังโดยการเรียกเมธอดของมัน ตัวอย่างเช่น วิธีการ
Collection.iterator()
ส่งกลับวัตถุของคลาส
Iterator
ที่ใช้ในการวนซ้ำผ่านคอลเลกชัน จากนั้นหากวัตถุต้นฉบับไม่มีตัววน
null
ซ้ำคุณสามารถส่งคืน
Null
วัตถุพิเศษที่มีวิธี
hasNext()
การส่งคืนเสมอ
false
แทน ผู้อ่านที่รัก นี่คือที่ที่ฉันสิ้นสุดเคล็ดลับในการกำจัดโปรแกรม Java ที่มีข้อผิดพลาด NullPointerException คุณจะประทับใจกับประโยชน์ของกฎง่ายๆ ที่ไม่ยุ่งยากเหล่านี้ เพื่อเป็นการเตือนความจำ หากคุณต้องการแบ่งปันเทคนิค NullPointerException อื่นๆ ในโปรแกรม Java โปรดดำเนินการดังกล่าวในความคิดเห็น
แปลโดยเฉพาะสำหรับนักเรียน JavaRush ต้นฉบับ
GO TO FULL VERSION