ฉันได้ยินจากครูว่าความผิดปกติส่วนใหญ่ในการศึกษาในอนาคตเป็นข้อยกเว้นตัวชี้ว่าง ดังนั้นใช้เวลาเล่นเกมเพื่อตรวจสอบข้อยกเว้นตัวชี้ว่างเปล่าคืออะไร
1: เหตุผลหลักสำหรับการเกิดข้อยกเว้นตัวชี้ว่างมีดังนี้:
(1) เมื่อไม่มีวัตถุมันจะสร้างข้อยกเว้น obj.method () // วัตถุ OBJ ไม่มีอยู่จริง
(2) เมื่อเข้าถึงหรือแก้ไขฟิลด์ที่ไม่มีอยู่ในวัตถุข้อยกเว้นจะถูกสร้างขึ้น obj.method () // วิธีการไม่มีอยู่จริง
(3) ตัวแปรสตริงไม่ได้เริ่มต้น
(4) วัตถุประเภทอินเตอร์เฟสไม่ได้เริ่มต้นด้วยคลาสเฉพาะเช่น:
รายการ LT; จะรายงานข้อผิดพลาด
รายการ lt = new ArrayList (); จะไม่มีข้อผิดพลาด
เมื่อค่าของวัตถุว่างเปล่าคุณจะไม่ตัดสินว่าจะว่างเปล่า คุณสามารถลองเพิ่มบรรทัดของรหัสก่อนรหัสต่อไปนี้:
if (rb! = null && rb! = "")
เปลี่ยนเป็น:
if (rb == null); if (rb! == null && rb! = "") หรือถ้า ((""). เท่ากับ (rb))วิธีแก้ปัญหาตัวชี้ว่าง:
มุ่งเน้นไปที่บรรทัดที่เกิดข้อผิดพลาดและวินิจฉัยข้อผิดพลาดเฉพาะผ่านเหตุผลหลักสองประการที่เกิดจากข้อยกเว้นตัวชี้โมฆะ ในเวลาเดียวกันเพื่อหลีกเลี่ยงการเกิดขึ้นของพอยน์เตอร์ที่เป็นโมฆะควรวางค่า "null" หรือค่าว่างก่อนที่ค่าที่กำหนดเมื่อทำการประมวลผลการตัดสิน
การวิเคราะห์สั้น ๆ ของข้อยกเว้นตัวชี้ว่างทั่วไป:
(1) ข้อผิดพลาดตัวชี้ null java.lang.nullpointerexception
มี 8 ประเภทข้อมูลพื้นฐานใน Java ค่าของตัวแปรสามารถมีค่าเริ่มต้น หากมีการเพิ่มโดยไม่มีการกำหนดปกติเครื่องเสมือน Java ไม่สามารถรวบรวมได้อย่างถูกต้อง ดังนั้นการใช้ชนิดข้อมูล Java พื้นฐานโดยทั่วไปจะไม่ทำให้เกิดข้อยกเว้นตัวชี้ว่าง ในการพัฒนาจริงข้อยกเว้นตัวชี้ว่างส่วนใหญ่ส่วนใหญ่เกี่ยวข้องกับการดำเนินการวัตถุ
2. กลไกการจัดการข้อยกเว้น Java
มีสองวิธีในการจัดการกับรหัสที่อาจมีข้อยกเว้น:
ก่อนอื่นให้ใช้คำสั่งลอง ... Catch ในวิธีการจับและจัดการข้อยกเว้น คำสั่งแคชสามารถมีหลายรายการเพื่อให้ตรงกับข้อยกเว้นหลายข้อ ตัวอย่างเช่น:
โมฆะสาธารณะ p (int x) {ลอง {... } catch (Exception e) {... } ในที่สุด {... }} ประการที่สองสำหรับข้อยกเว้นที่ไม่สามารถประมวลผลได้หรือผู้ที่จำเป็นต้องเปลี่ยนผ่านให้ผ่านการประกาศของวิธีการ
คำสั่งโยนโยนข้อยกเว้น ตัวอย่างเช่น:
โมฆะสาธารณะ test1 () โยน myexception {... ถ้า (.... ) {โยน myexception ใหม่ ();}}หากแต่ละวิธีเพียงแค่โยนข้อยกเว้นในการโทรที่ซ้อนกันหลายชั้นไปยังวิธีการเรียกเมธอดเครื่องเสมือน Java จะค้นหากลับจากบล็อกเมธอดที่มีข้อยกเว้นเกิดขึ้นจนกว่าจะพบบล็อกรหัสที่จัดการข้อยกเว้น จากนั้นส่งข้อยกเว้นไปยังคำสั่งจับที่สอดคล้องกันสำหรับการประมวลผล หาก Java Virtual Machine ติดตามกลับไปที่ Main () วิธีที่ด้านล่างของสแต็กวิธีการเรียกใช้หากบล็อกรหัสที่จัดการข้อยกเว้นยังไม่พบขั้นตอนต่อไปนี้จะถูกจัดการ:
ก่อนอื่นให้โทรหาวิธี PrintStackTrace () ของวัตถุข้อยกเว้นและพิมพ์ข้อมูลข้อยกเว้นของเมธอดการเรียกสแต็ก
ประการที่สองหากเธรดที่เกิดขึ้นข้อยกเว้นคือเธรดหลักการรันโปรแกรมทั้งหมดจะสิ้นสุดลง หากไม่ใช่เธรดหลักเธรดจะถูกยกเลิกและเธรดอื่น ๆ ยังคงทำงานต่อไป
ผ่านการวิเคราะห์และการคิดเราจะเห็นได้ว่าการประมวลผลที่ผิดปกติก่อนหน้านี้ยิ่งมีทรัพยากรและเวลาที่ใช้เวลาน้อยลงเท่าไหร่ขอบเขตของผลกระทบก็ยิ่งเล็กลงเท่านั้น ดังนั้นอย่าโยนข้อยกเว้นที่คุณสามารถจัดการกับผู้โทรได้เช่นกัน
อีกจุดหนึ่งไม่สามารถเพิกเฉยได้: คำสั่งสุดท้ายจะต้องเรียกใช้รหัสในกรณีใด ๆ ซึ่งสามารถมั่นใจได้ถึงความน่าเชื่อถือของรหัสบางอย่างที่ต้องดำเนินการในทุกกรณี ตัวอย่างเช่นเมื่อการสืบค้นฐานข้อมูลผิดปกติการเชื่อมต่อ JDBC ควรได้รับการปล่อยตัว ฯลฯ คำสั่งสุดท้ายจะถูกดำเนินการก่อนที่คำสั่ง Return โดยไม่คำนึงถึงคำสั่งหรือสถานที่หรือไม่ว่าจะมีข้อยกเว้นในบล็อกลอง สถานการณ์เดียวที่คำสั่งสุดท้ายไม่ได้ดำเนินการคือวิธีการดำเนินการวิธีการ System.Exit () ฟังก์ชั่น System.Exit () เพื่อยุติเครื่องเสมือน Java ที่กำลังทำงานอยู่ในปัจจุบัน ค่าส่งคืนของผลตอบแทนไม่สามารถเปลี่ยนแปลงได้โดยการกำหนดค่าใหม่ให้กับตัวแปรในบล็อกคำสั่งสุดท้าย นอกจากนี้ยังแนะนำให้ไม่ใช้คำสั่ง Return ในบล็อกสุดท้าย มันไม่มีความหมายและสามารถนำไปสู่ข้อผิดพลาดได้อย่างง่ายดาย
ในที่สุดคุณควรให้ความสนใจกับกฎไวยากรณ์สำหรับการจัดการข้อยกเว้น:
ก่อนอื่น ลองใช้คำสั่งไม่สามารถอยู่คนเดียวได้ แต่สามารถประกอบไปด้วยการจับและในที่สุด
ลอง ... จับ ... ในที่สุดลอง ... ลองลอง ... ในที่สุดลอง ... ในที่สุดการจับคำสั่งอาจมีหนึ่งหรือมากกว่านั้นและในที่สุดก็สามารถเป็นคำสั่งได้มากที่สุด คำหลักสามคำลองจับและในที่สุดก็ไม่สามารถใช้คนเดียวได้
ประการที่สอง ขอบเขตของตัวแปรในบล็อกรหัสทั้งสามนั้นเป็นอิสระและไม่สามารถเข้าถึงได้ หากคุณต้องการเข้าถึงได้ในทั้งสามบล็อกคุณต้องกำหนดตัวแปรนอกบล็อกเหล่านี้
ประการที่สาม เมื่อใช้บล็อกการจับหลายตัวเครื่องเสมือน Java จะตรงกับหนึ่งในคลาส Exception หรือ subclass และดำเนินการบล็อก catch โดยไม่ต้องดำเนินการบล็อกจับอื่น ๆ
ประการที่สี่ ไม่มีข้อความอื่นใดที่ตามมาหลังจากคำสั่งการโยนเพราะสิ่งเหล่านี้ไม่มีโอกาสดำเนินการ
ประการที่ห้า หากวิธีหนึ่งเรียกวิธีการอื่นที่ประกาศข้อยกเว้นที่โยนลงไปแล้ววิธีนี้จะจัดการข้อยกเว้นหรือประกาศการโยน
2.2 ความแตกต่างระหว่างคำหลักโยนและโยน:
การโยนถูกใช้เพื่อโยนข้อยกเว้นภายในร่างกายของวิธีการ รูปแบบไวยากรณ์คือ: โยนวัตถุข้อยกเว้น
การขว้างจะใช้เพื่อประกาศว่าจะมีข้อยกเว้นใดบ้าง หลังจากชื่อวิธีการรูปแบบไวยากรณ์คือ:
พ่นข้อยกเว้นประเภท 1, ข้อยกเว้นประเภท 2 ... ประเภทข้อยกเว้น n
สาม: รายการต่อไปนี้แสดงหลายสถานการณ์และโซลูชันที่สอดคล้องกันซึ่งอาจมีข้อยกเว้นตัวชี้โมฆะ:
รหัสตัวอย่าง 1:
out.println (request.getParameter ("ชื่อผู้ใช้"));การวิเคราะห์: ฟังก์ชั่นของเซ็กเมนต์โค้ด 1 นั้นง่ายมากซึ่งคือการส่งออกค่าของผู้ใช้อินพุต "ชื่อผู้ใช้"
หมายเหตุ: ดูเหมือนว่าคำสั่งข้างต้นไม่สามารถหาข้อผิดพลาดทางไวยากรณ์ใด ๆ และในกรณีส่วนใหญ่ไม่มีปัญหา อย่างไรก็ตามหากผู้ใช้ไม่ได้ให้ค่าของฟิลด์ฟอร์ม "ชื่อผู้ใช้" เมื่อป้อนข้อมูลหรือข้ามแบบฟอร์มโดยตรงอินพุตผ่านบางวิธีค่าของคำขอนี้ getParameter ("ชื่อผู้ใช้") ว่างเปล่า (โปรดทราบว่ามันไม่ใช่สตริงที่ว่างเปล่า "java.lang.nullpointerexception" ยกเว้น ยิ่งไปกว่านั้นแม้ว่าวัตถุอาจว่างเปล่า แต่บางวิธีของ java.lang.Object หรือวัตถุวัตถุนั้นถูกเรียกเช่น toString (), เท่ากัน (Object OBJ) และการดำเนินการอื่น ๆ
รหัสตัวอย่าง 2:
String username = request.getParameter ("ชื่อผู้ใช้"); if (username.equals ("root")) {... }การวิเคราะห์: ฟังก์ชั่นของส่วนโค้ด 2 คือการตรวจจับชื่อผู้ใช้ที่ได้รับจากผู้ใช้ หากเป็นผู้ใช้ที่มีชื่อผู้ใช้คือ "รูท" การดำเนินการพิเศษบางอย่างจะดำเนินการ
หมายเหตุ: ในส่วนโค้ด 2 หากผู้ใช้ไม่ได้ให้ค่าของฟิลด์ฟอร์ม "ชื่อผู้ใช้" ชื่อผู้ใช้วัตถุสตริงเป็นค่า NULL และวัตถุ NULL หนึ่งวัตถุไม่สามารถเปรียบเทียบกับวัตถุอื่นได้โดยตรง ในทำนองเดียวกันหน้า JSP ที่ส่วนโค้ด 2 อยู่ในตำแหน่งจะส่งข้อผิดพลาดตัวชี้ว่างเปล่า
เคล็ดลับเล็ก ๆ : หากคุณต้องการเปรียบเทียบค่าการส่งคืนของวิธีการบางอย่างด้วยค่าคงที่และวางค่าคงที่ไว้ข้างหน้าคุณสามารถหลีกเลี่ยงการเรียกใช้วิธี Equals ของวัตถุ NULL ตัวอย่างเช่น:
if ("root" .equals (ชื่อผู้ใช้)) {... }แม้ว่าวัตถุชื่อผู้ใช้จะส่งคืนวัตถุ NULL แต่ก็จะไม่มีข้อยกเว้นตัวชี้ว่างที่นี่และสามารถทำงานได้ตามปกติ
ตัวอย่าง 3:
string username = session.getAttribute ("session.username"). toString ();การวิเคราะห์: ฟังก์ชั่นของเซ็กเมนต์รหัส 3 คือการใช้ค่าของเซสชันชื่อผู้ใช้ในเซสชันและกำหนดค่าให้กับชื่อผู้ใช้วัตถุสตริง
หมายเหตุ: โดยทั่วไปหากผู้ใช้มีเซสชันอยู่แล้วจะไม่มีปัญหาเกิดขึ้น อย่างไรก็ตามหากแอปพลิเคชันเซิร์ฟเวอร์รีสตาร์ทในเวลานี้และผู้ใช้ยังไม่ได้ลงชื่อเข้าใช้อีกครั้ง (อาจเป็นได้ว่าผู้ใช้จะปิดเบราว์เซอร์ แต่ยังคงเปิดหน้าต้นฉบับ) จากนั้นค่าของเซสชันจะไม่ถูกต้องในเวลานี้ การดำเนินการโดยตรงของการทำงานของ ToString () บนวัตถุที่มีค่า NULL จะทำให้ระบบโยนข้อยกเว้นตัวชี้โมฆะ
ตัวอย่าง 4:
โมฆะคงที่สาธารณะหลัก (String args []) {person p = null; P.SetName ("Zhang San"); System.out.println (P.GetName ()); -การวิเคราะห์: ประกาศวัตถุบุคคลและพิมพ์ชื่อในวัตถุ
หมายเหตุ: ในเวลานี้ P ของคุณจะมีข้อยกเว้นตัวชี้โมฆะเพราะคุณเพิ่งประกาศว่าวัตถุประเภทบุคคลนี้ไม่ได้สร้างวัตถุดังนั้นจึงไม่มีการอ้างอิงที่อยู่ในกอง ไม่จำเป็นต้องสร้างวัตถุเมื่อใช้วัตถุและใช้วิธีการ
ตอบ: เริ่มใช้โดยตรงไม่ว่าวัตถุจะว่างเปล่าหรือไม่ก็ตาม
(JSP) ส่วนโค้ด 1:
out.println (request.getParameter ("ชื่อผู้ใช้"));การวิเคราะห์: ฟังก์ชั่นของเซ็กเมนต์โค้ด 1 นั้นง่ายมากซึ่งคือการส่งออกค่าของผู้ใช้อินพุต "ชื่อผู้ใช้"
หมายเหตุ: ดูเหมือนว่าคำสั่งข้างต้นไม่สามารถหาข้อผิดพลาดทางไวยากรณ์ใด ๆ และในกรณีส่วนใหญ่ไม่มีปัญหา อย่างไรก็ตามหากผู้ใช้ไม่ได้ให้ค่าของฟิลด์ฟอร์ม "ชื่อผู้ใช้" เมื่อป้อนข้อมูลหรือข้ามแบบฟอร์มโดยตรงอินพุตผ่านบางวิธีค่าของคำขอนี้ getParameter ("ชื่อผู้ใช้") ว่างเปล่า (โปรดทราบว่ามันไม่ใช่สตริงที่ว่างเปล่า "java.lang.nullpointerexception" ยกเว้น ยิ่งไปกว่านั้นแม้ว่าวัตถุอาจว่างเปล่า แต่บางวิธีของ java.lang.Object หรือวัตถุวัตถุนั้นถูกเรียกเช่น toString (), เท่ากัน (Object OBJ) และการดำเนินการอื่น ๆ
(JSP) ตัวอย่าง 2:
String username = request.getParameter ("ชื่อผู้ใช้"); if (username.equals ("root")) {... }การวิเคราะห์: ฟังก์ชั่นของส่วนโค้ด 2 คือการตรวจจับชื่อผู้ใช้ที่ได้รับจากผู้ใช้ หากเป็นผู้ใช้ที่มีชื่อผู้ใช้คือ "รูท" การดำเนินการพิเศษบางอย่างจะดำเนินการ
หมายเหตุ: ในส่วนโค้ด 2 หากผู้ใช้ไม่ได้ให้ค่าของฟิลด์ฟอร์ม "ชื่อผู้ใช้" ชื่อผู้ใช้วัตถุสตริงเป็นค่า NULL และวัตถุ NULL หนึ่งวัตถุไม่สามารถเปรียบเทียบกับวัตถุอื่นได้โดยตรง ในทำนองเดียวกันหน้า JSP ที่ส่วนโค้ด 2 อยู่ที่จะโยน (java.lang.nullpointerexception) ข้อผิดพลาดตัวชี้โมฆะ
(JSP) ตัวอย่าง 3:
string username = session.getAttribute ("session.username"). toString ();การวิเคราะห์: ฟังก์ชั่นของเซ็กเมนต์รหัส 3 คือการใช้ค่าของเซสชันชื่อผู้ใช้ในเซสชันและกำหนดค่าให้กับชื่อผู้ใช้วัตถุสตริง
หมายเหตุ: โดยทั่วไปหากผู้ใช้มีเซสชันอยู่แล้วจะไม่มีปัญหาเกิดขึ้น อย่างไรก็ตามหากแอปพลิเคชันเซิร์ฟเวอร์รีสตาร์ทในเวลานี้และผู้ใช้ยังไม่ได้ลงชื่อเข้าใช้อีกครั้ง (อาจเป็นได้ว่าผู้ใช้จะปิดเบราว์เซอร์ แต่ยังคงเปิดหน้าต้นฉบับ) จากนั้นค่าของเซสชันจะไม่ถูกต้องในเวลานี้ การดำเนินการโดยตรงของการดำเนินการ toString () บนวัตถุที่เป็นโมฆะจะทำให้ระบบโยน (java.lang.nullpointerexception) ข้อยกเว้นตัวชี้ null
ข้างต้นเป็นเนื้อหาเต็มรูปแบบของการสนทนาสั้น ๆ เกี่ยวกับการจัดการข้อยกเว้น Java ของข้อยกเว้นตัวชี้ว่างที่นำมาให้คุณโดยบรรณาธิการ ฉันหวังว่าทุกคนจะสนับสนุน wulin.com เพิ่มเติม ~