วันนี้ฉันจะแสดงเทคนิคง่ายๆ เกี่ยวกับวิธีการหลีกเลี่ยง NullPointerException ในแอปพลิเคชันของคุณ ง่ายต่อการปฏิบัติตาม แต่ปรับปรุงความน่าเชื่อถือและคุณภาพของโค้ดของคุณได้อย่างมาก จากประสบการณ์ของผม เคล็ดลับแรกจะมีผลกระทบที่เห็นได้ชัดเจนต่อคุณภาพของโค้ดของคุณ หากคุณทราบเทคนิคการเขียนโปรแกรม Java อื่น ๆ โปรดแบ่งปันในความคิดเห็น
ใช้
มีไลบรารีโอเพ่นซอร์สจำนวนมากที่รับภาระหนักในการทดสอบไฟล์พยายามอย่าส่งคืน
นี่เป็นเคล็ดลับการเขียนโปรแกรม Java ที่ดีอีกประการหนึ่งที่ Joshua Bloch อธิบายไว้ในหนังสือ Java: การเขียนโปรแกรมที่มีประสิทธิภาพ เมื่อส่งคืนคอลเลกชันหรืออาร์เรย์ว่าง ตรวจสอบให้แน่ใจว่าการเรียกเมธอดพื้นฐานชอบ
เรียกใช้เมธอดเท่ากับ () และเท่ากับ IgnoreCase() บนสตริงลิเทอรัลที่รู้จักแทนที่จะเป็นวัตถุที่ไม่รู้จัก
เรียกเมธอดequals()
บนสตริงที่รู้จักซึ่งคุณรู้ว่าไม่ใช่null
เสมอ วิธีการนี้equals()
เป็นแบบสมมาตร นั่นคือการเรียกa.equals(b)
และb.equals(a)
จะให้ผลลัพธ์เดียวกัน (ถ้าไม่ใช่a
) และด้วยเหตุ นี้โปรแกรมเมอร์จำนวนมากจึงไม่ใส่ใจว่าวัตถุใดถูกเรียกy หรือ y ผลข้างเคียงอย่างหนึ่งของสิ่งนี้คือ NullPointerException หากมีการเรียกใช้เมธอดบน b
null
equals()
a
b
null
Object unknownObject = null;
//плохой способ - может вызвать NullPointerException
if(unknownObject.equals("knownObject")){
System.err.println("This may result in NullPointerException if unknownObject is null");
}
//правильный способ - исключение NullPointerException не возникнет, даже если unknownObject 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)); //не выбрасывает NPE
System.out.println(bd.toString()); //выбрасывает "Exception in thread "main" java.lang.NullPointerException"
ใช้เคล็ดลับเหล่านี้เมื่อคุณไม่แน่ใจว่าวัตถุนั้นมีอยู่จริงnull
หรือไม่
ใช้null
วิธีและไลบรารี -safe
มีไลบรารีโอเพ่นซอร์สจำนวนมากที่รับภาระหนักในการทดสอบไฟล์null
. หนึ่งในสิ่งที่พบมากที่สุดคือStringUtils
จาก Apache Commons โดยใช้วิธีการ ต่างๆเช่นStringUtils.isBlank()
, isNumeric()
ฯลฯ isWhiteSpace()
คุณไม่ต้องกังวลกับการขว้าง NullPointerException
//Методы StringUtils являются null-безопасными, они не вызовут 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