JavaRush /จาวาบล็อก /Random-TH /เคล็ดลับและเคล็ดลับ วิธีหลีกเลี่ยง NullPointerException ใ...
DarthVictor
ระดับ

เคล็ดลับและเคล็ดลับ วิธีหลีกเลี่ยง NullPointerException ในแอปพลิเคชัน Java

เผยแพร่ในกลุ่ม
เคล็ดลับและเคล็ดลับ  วิธีหลีกเลี่ยง NullPointerException ในแอปพลิเคชัน Java - 1วันนี้ฉันจะแสดงเทคนิคง่ายๆ เกี่ยวกับวิธีการหลีกเลี่ยง NullPointerException ในแอปพลิเคชันของคุณ ง่ายต่อการปฏิบัติตาม แต่ปรับปรุงความน่าเชื่อถือและคุณภาพของโค้ดของคุณได้อย่างมาก จากประสบการณ์ของผม เคล็ดลับแรกจะมีผลกระทบที่เห็นได้ชัดเจนต่อคุณภาพของโค้ดของคุณ หากคุณทราบเทคนิคการเขียนโปรแกรม Java อื่น ๆ โปรดแบ่งปันในความคิดเห็น เคล็ดลับและเคล็ดลับ  วิธีหลีกเลี่ยง NullPointerException ในแอปพลิเคชัน Java - 2

เรียกใช้เมธอดเท่ากับ () และเท่ากับ IgnoreCase() บนสตริงลิเทอรัลที่รู้จักแทนที่จะเป็นวัตถุที่ไม่รู้จัก

เรียกเมธอดequals()บนสตริงที่รู้จักซึ่งคุณรู้ว่าไม่ใช่nullเสมอ วิธีการนี้equals()เป็นแบบสมมาตร นั่นคือการเรียกa.equals(b)และb.equals(a)จะให้ผลลัพธ์เดียวกัน (ถ้าไม่ใช่a) และด้วยเหตุ นี้โปรแกรมเมอร์จำนวนมากจึงไม่ใส่ใจว่าวัตถุใดถูกเรียกy หรือ y ผลข้างเคียงอย่างหนึ่งของสิ่งนี้คือ NullPointerException หากมีการเรียกใช้เมธอดบน bnullequals()abnull
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()การอ้างอิงที่มีค่า ทำให้ เกิดnullNullPointerException จึงควรใช้การเรียกvalueOf()เมื่อเราได้ผลลัพธ์เดียวกัน เนื่องจากการเรียกvalueOf()จากnullreturn โดยเฉพาะอย่างยิ่ง สำหรับคลาส nullwrapper เช่นInteger, FloatหรือDoubleBigDecimal
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_SETCollections.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 ต้นฉบับ
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION