Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

วิธีแก้ปัญหา java.lang.NullPointerException Error

คุณต้องเคยเจอสิ่งที่เรียกว่า NullPointerException หากคุณเคยทำงานบนแอปพลิเคชันที่ใช้ Java Null Pointer Exception เป็นหนึ่งในข้อผิดพลาดที่พบบ่อยที่สุดในการพัฒนาแอปพลิเคชัน Java ข้อยกเว้นนี้มักเป็นผลมาจากข้อผิดพลาดของมนุษย์ แต่เวลาอาจสูญเปล่าไปกับข้อผิดพลาดในการดีบักเช่นนี้ ปัญหานี้ไม่ใช่ข้อผิดพลาดทางวากยสัมพันธ์ทั้งหมด ดังนั้นจึงอาจระบุปัญหาได้ยากในบางครั้ง

ในบทความนี้ เราจะมาดูกันว่า java.lang.NullPointerException คืออะไร เหตุใดจึงเกิดขึ้น คุณสามารถแก้ไขได้อย่างไร และแนวทางปฏิบัติที่ดีที่สุดบางประการที่ควรปฏิบัติตามเพื่อหลีกเลี่ยงการเรียกใช้ตัวชี้ค่าว่างที่ไม่เหมาะสม เพื่อไม่ให้เป็นการเสียเวลา เรามาเริ่มกันเลย

java.lang.NullPointerException คืออะไร

Null Pointer Exception เป็นหนึ่งใน Exceptions ต่างๆ ที่สนับสนุนโดยภาษา Java สิ่งนี้บ่งชี้ว่ามีความพยายามในการเข้าถึงตัวแปรอ้างอิงที่ชี้ไปที่ค่าว่างในปัจจุบัน

Null คือค่าดีฟอลต์ใน Java ที่กำหนดให้กับตัวแปรซึ่งไม่ได้เริ่มต้นโดยผู้ใช้หลังจากหรือด้วยการประกาศ ลองพิจารณาตัวอย่างต่อไปนี้เมื่อคุณประกาศตัวแปรดังนี้:

สตริง str;

แล้วลองพิมพ์เนื้อหาของตัวแปร:

System.out.println(str);// => null

ดังที่เห็นด้านบน 'null' จะถูกพิมพ์บนเอาต์พุต นี่แสดงว่าเนื่องจากตัวแปร str ไม่ได้กำหนดค่าเริ่มต้น ค่านี้จึงชี้ไปที่หรือเก็บค่าไว้เป็น null ปัญหาที่ตัวแปรชี้ค่าว่างคือตัวแปรนั้นเป็นเพียงข้อมูลอ้างอิงเท่านั้น และไม่ได้ชี้ไปที่สิ่งใด หากคุณพยายามดำเนินการบางอย่างกับข้อมูลที่เก็บไว้ในตัวแปรชี้ค่า null ระบบจะไม่ทราบว่าต้องทำอย่างไร สิ่งนี้เกิดขึ้นเนื่องจากไม่มีข้อมูลที่เก็บไว้ในตัวแปรจริง มันชี้ไปที่สิ่งที่เป็นโมฆะ

ตัวอย่างของ java.lang.NullPointer.Exception

การค้นหาตัวอย่างของ java.lang.NullPointerException ไม่ใช่เรื่องยาก เนื่องจากสิ่งที่คุณต้องทำคือไม่ต้องเตรียมข้อมูลเบื้องต้นให้กับตัวแปรก่อนที่จะพยายามเข้าถึง ตัวอย่างเช่น ลองพิจารณาคลาส StringBuilder StringBuilder เป็นคลาสที่ใช้ในการจัดการกับการก่อตัวและการจัดการสตริง ต่อไปนี้คือวิธีปกติที่คุณจะใช้คลาสเพื่อสร้างสตริง:

<ก่อน>นำเข้า java.util.StringBuilder; การทดสอบคลาสสาธารณะ { โมฆะสาธารณะหลัก (สตริง [] args) { StringBuilder sb =ใหม่ StringBuilder (); sb.append("สวัสดี"); sb.append("โลก!"); ผลลัพธ์สตริง =sb.toString(); System.out.println(ผลลัพธ์); // => สวัสดีชาวโลก! }}

หากคุณเรียกใช้ข้อมูลโค้ดด้านบน ก็จะใช้ได้ดี มาดูรุ่นที่แก้ไขกันซึ่งจะมีข้อยกเว้นตัวชี้ null:

81% ของผู้เข้าร่วมกล่าวว่าพวกเขารู้สึกมั่นใจมากขึ้นเกี่ยวกับโอกาสในการทำงานด้านเทคโนโลยีหลังจากเข้าร่วม bootcamp จับคู่กับ Bootcamp วันนี้

ผู้สำเร็จการศึกษาจากหลักสูตร bootcamp โดยเฉลี่ยใช้เวลาน้อยกว่าหกเดือนในการเปลี่ยนอาชีพ ตั้งแต่เริ่มต้น bootcamp ไปจนถึงหางานแรก

<ก่อน>นำเข้า java.util.StringBuilder; การทดสอบคลาสสาธารณะ { โมฆะสาธารณะหลัก (สตริง [] args) { StringBuilder sb; sb.append("สวัสดี"); sb.append("โลก!"); ผลลัพธ์สตริง =sb.toString(); System.out.println(ผลลัพธ์); }}

อย่างที่คุณเห็น เราไม่ได้เริ่มต้นอินสแตนซ์ของคลาส StringBuilder ในขณะที่ประกาศ เมื่อ sb.append() มีการดำเนินการบรรทัด sb ไม่ได้ชี้ไปที่วัตถุใด ๆ ในความเป็นจริง แต่ชี้ไปที่ null นี่คือที่ที่ NullPointerException ถูกส่งออกไป เนื่องจากมีการโยนข้อยกเว้น JVM จึงไม่สามารถดำเนินการคำสั่งใดๆ หลังจากนี้

วิธีการแก้ไขข้อผิดพลาด java.lang.NullPointerException

การสร้าง Null Pointer Exception นั้นง่าย แต่การหลีกเลี่ยงหรือแก้ไขนั้นค่อนข้างยุ่งยาก แม้ว่าสภาพแวดล้อมการพัฒนาแบบบูรณาการ (IDE) บางอย่างจะเตือนคุณว่าคุณกำลังเข้าถึงตัวแปรก่อนที่จะเริ่มต้นตัวแปรด้วยค่าที่เข้ากันได้ IDE ส่วนใหญ่ไม่สามารถเข้าใจสิ่งนี้ในสถานการณ์ที่ซับซ้อน เช่น เมื่อส่งผ่านตัวแปรผ่านการเรียกใช้เมธอดหลายรายการ การแก้ไขที่แน่นอนสำหรับ Null Pointer Exception ขึ้นอยู่กับสถานการณ์และรหัสของคุณ ต่อไปนี้คือวิธียอดนิยมบางส่วนในการแก้ไขสถานการณ์ทั่วไปของ Null Pointer:

ตรวจสอบรหัสของคุณเพื่อหาข้อผิดพลาดด้วยตนเอง

สาเหตุที่ใหญ่ที่สุดที่ข้อยกเว้นตัวชี้ Null เกิดขึ้นคือข้อผิดพลาดของมนุษย์ ตรวจสอบให้แน่ใจว่าโปรแกรมที่คุณเขียนนั้นใช้ตรรกะที่ถูกต้องตามที่คุณตั้งใจไว้ตั้งแต่แรก นอกจากนี้ ตรวจดูซอร์สโค้ดเพื่อดูว่าคุณพลาดคำสั่งใด ๆ หรือสะกดตัวแปรใด ๆ ผิดซึ่งอาจทำให้ตัวแปรบางตัวไม่ได้รับการกำหนดค่า

ตรวจสอบให้แน่ใจว่าคุณได้เขียนโค้ดของคุณในแบบที่ตรรกะของคุณชี้นำ และไม่พลาดในการเขียนข้อความสั่งใดๆ หรือไม่ได้กำหนดอ็อบเจ็กต์ให้กับการอ้างอิงที่ไม่ถูกต้อง ตามกฎทั่วไป ให้ตรวจสอบว่าก่อนที่จะใช้ตัวแปรใดๆ ตัวแปรจะถูกเริ่มต้นด้วยอ็อบเจ็กต์

ตรวจสอบความปลอดภัยรอบ ๆ รหัสที่อาจทำให้เกิดข้อยกเว้นตัวชี้ Null

หากคุณทราบบรรทัดของโค้ดที่ทำให้เกิด NullPointer ของคุณและเชื่อว่าตรรกะของคุณถูกต้องเช่นกัน คุณสามารถรวมส่วนของโค้ดในบล็อก try-catch และกำหนดลักษณะการทำงานเมื่อตรวจพบ Null Pointer นี่คือลักษณะของการตั้งค่าดังกล่าว:

...// โค้ดบางส่วนที่สูงกว่า { // ใส่โค้ดที่มีแนวโน้มยกเว้นที่นี่} catch (NullPointerException npe) { // กำหนดสิ่งที่ต้องทำเมื่อตรวจพบ NPE}// บางโค้ดด้านล่าง... 

สิ่งนี้เกิดขึ้นในสถานการณ์ที่ตัวแปรอ้างอิงบางตัวอาจมีหรือไม่มีค่า null บ่อยครั้ง การตอบสนอง API ระยะไกล การตอบสนองต่ออินเทอร์เฟซของอุปกรณ์มักมีแนวโน้มที่จะเกิดสถานการณ์นี้ ขึ้นอยู่กับความพร้อมของผลลัพธ์หรือฮาร์ดแวร์ ตัวแปรการตอบสนองอาจชี้หรือไม่ชี้ไปที่อ็อบเจ็กต์ที่สร้างอินสแตนซ์ การใช้การตรวจสอบความปลอดภัยเหมาะสมที่สุดเพื่อจัดการกับสถานการณ์เหล่านี้

ตรวจสอบค่าว่างก่อนเข้าถึงบางสิ่ง

วิธีนี้คล้ายกับวิธี try-catch ในวิธีนี้ บล็อก 'if' จะใช้เพื่อตรวจสอบค่า null ก่อนเข้าถึงตัวแปร ตัวอย่างโค้ดก่อนหน้าจะมีลักษณะดังนี้หากใช้บล็อก "if" เพื่อตรวจจับข้อผิดพลาด:

...// บางโค้ดด้านบนIf (myVar !==null ) { // ใส่ตรรกะความสำเร็จที่นี่} else { // จัดการค่า null ที่นี่}// โค้ดบางส่วนด้านล่าง...

ความแตกต่างที่ใหญ่ที่สุดระหว่างสองวิธีคือขอบเขตของการตรวจสอบที่พวกเขาทำ วิธี if ตรวจสอบตัวแปร myVar สำหรับค่า Null เท่านั้น ในขณะที่บล็อก try-catch จะตรวจจับตัวแปรใดๆ และทั้งหมดที่เป็นค่าว่าง

สิ่งนี้ทำให้บล็อก 'if' เป็นแนวทางที่ตรงเป้าหมายและชัดเจนยิ่งขึ้นเพื่อรองรับตัวชี้ค่าว่างในตรรกะของแอปพลิเคชันของคุณ อย่างไรก็ตาม หากมีตัวแปรมากกว่าหนึ่งตัวที่อาจไม่มีค่า ควรใช้บล็อก try-catch เพื่อความเรียบง่าย

บทสรุป

บทความนี้พิจารณาว่า Null Pointer Exception คืออะไรใน Java และข้อผิดพลาดนี้เกิดขึ้นได้อย่างไร เรายังดูโค้ดบางส่วนที่จะทำให้เกิด Null Pointer Exception เพื่อทำความเข้าใจว่า Null Pointers ถูกสร้างขึ้นในสถานการณ์จริงอย่างไร สุดท้าย เราได้กำหนดวิธียอดนิยมบางอย่างในการแก้ไข Null Pointer Exception และยุติการสนทนาโดยเปรียบเทียบระหว่างสองวิธีในการแก้ไข NPE

หากคุณต้องการเขียนโปรแกรม Java Null Pointer Exception เป็นหนึ่งในจุดบกพร่องที่สำคัญที่คุณต้องรู้วิธีแก้ไข ข้อยกเว้นนี้เป็นปัญหาที่พบบ่อยที่สุดปัญหาหนึ่งและไม่เกี่ยวข้องกับไวยากรณ์หรือความหมายของโค้ดของคุณ ซึ่งทำให้ข้อยกเว้นเป็นหนึ่งในปัญหาที่ยากที่สุดในการระบุและแก้ไข ข้อมูลอ้างอิงโดยย่อสำหรับการแก้ไขปัญหาเช่นบทความนี้จะทำให้ประสบการณ์ของคุณราบรื่นยิ่งขึ้น