กลัวข้อผิดพลาด แต่อย่าเขียนใน Java! คุณอาจทราบบางอย่างเกี่ยวกับข้อยกเว้นใน Javaแล้ว วันนี้อย่างน้อยความรู้เพียงผิวเผินจะเป็นประโยชน์ต่อคุณ เราจะวิเคราะห์คลาส Error และประเภทข้อยกเว้นพิเศษที่ทำให้หลายคนตกใจเมื่อปรากฏในสแต็กเทรซ

ที่ด้านบนสุดของลำดับชั้นข้อยกเว้นของ Java คือ คลาส Throwableซึ่งมีสองลำดับชั้น:

  • ข้อยกเว้นซึ่งรับผิดชอบต่อข้อผิดพลาดในโปรแกรมของคุณ
  • และฮีโร่ของเราในวันนี้ — ข้อผิดพลาดซึ่งรับผิดชอบข้อผิดพลาดใน JVM
    เป็นมูลค่าการกล่าวขวัญว่าสิ่งเหล่านี้อาจไม่ใช่ข้อผิดพลาดในการเข้ารหัส แต่เป็นปัญหาที่มักไม่ขึ้นอยู่กับผู้พัฒนา

จะทำอย่างไรกับข้อผิดพลาด

เมื่อตรวจพบ "ข้อผิดพลาด" คุณจะไม่สามารถดำเนินการใดๆ ในcatch block ได้ ยกเว้นการบันทึกเนื่องจากเรากำลังพูดถึงปัญหาใน JVM เอง

การบันทึกเป็นสิ่งที่ดี: เมื่อคุณได้รับข้อผิดพลาดรันไทม์ คุณสามารถดูบันทึก ดูสาเหตุ และรู้ว่าต้องแก้ไขอะไร

เนื่องจากคุณไม่รู้ว่าคุณอาจได้รับข้อผิดพลาดประเภทใดเมื่อคุณเขียนโค้ด จึงไม่มีเหตุผลที่จะเขียนประเภทใดประเภทหนึ่งลงในcatch block การใช้ คลาส Errorนั้นไม่ใช่วิธีแก้ปัญหาที่ดีที่สุด เนื่องจากในกรณีนี้ คุณจะตรวจจับได้เฉพาะข้อผิดพลาดเท่านั้น

ดังนั้นจึงเป็นการดีกว่าถ้าใช้คลาสThrowableซึ่งสามารถตรวจจับได้ทั้งErrorและException สิ่งนี้มีลักษณะอย่างไรในทางปฏิบัติ?

การเขียนโค้ดแบบนี้ไม่ถูกต้อง:

try {
    // Your code
} catch (OutOfMemoryError outOfMemoryError) {
    // Code to catch OutOfMemoryError
}
การเขียนโค้ดแบบนี้ก็ไม่เป็นไรเช่นกัน:

try {
    // Your code
} catch (Error error) {
    // Code to catch all Errors
}
แต่รหัสเช่นนี้ก็โอเค:

try {
    // Your code
} catch (Throwable throwable) {
    // Code to catch all Throwables
}

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

ข้อผิดพลาดทั่วไป

ข้อผิดพลาดยอดนิยมบางส่วน ได้แก่คลาสOutOfMemoryErrorและStackOverflowError

OutOfMemoryErrorมักจะปรากฏขึ้นเมื่อโปรแกรมมีหน่วยความจำไม่เพียงพอสำหรับสร้างอ็อบเจกต์และตัวเก็บขยะไม่สามารถเก็บได้ทัน ผลลัพธ์คือ OutOfMemoryError

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

ตัวอย่างเช่น โค้ดแบบนี้จะสร้างขยะจำนวนมากในหน่วยความจำ:


while (true) {
    new Object();
}

ข้อผิดพลาดที่สองที่ฉันอยากจะบอกคุณคือStackOverflowErrorซึ่งเกิดขึ้นเมื่อสแต็กโอเวอร์โฟลว์ เนื่องจากสแต็กส่วนใหญ่เก็บตัวแปรโลคัล พารามิเตอร์ และการเรียกใช้เมธอด การเรียกซ้ำ (หรือการเรียกเมธอดแบบเรียกซ้ำ) จึงเป็นสาเหตุที่พบบ่อยมากของข้อผิดพลาดนี้:


public void foo() {
    foo();
}

เพื่อหลีกเลี่ยงปัญหาระหว่างการทำงานของโปรแกรม IDEs สมัยใหม่มักจะเตือนเกี่ยวกับการเรียกใช้เมธอดแบบวนซ้ำ

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

ความแตกต่างระหว่างประเภทข้อผิดพลาดและข้อยกเว้น

ข้อผิดพลาด ข้อยกเว้น
ไม่สามารถแก้ไขในcatch block สามารถจัดการได้ในcatch block
ไม่เกิดขึ้นในขณะรวบรวม สามารถจับได้ในเวลารวบรวม
ปัญหาใน JVM ปัญหาในตรรกะรหัส
ข้อผิดพลาดทั้งหมดไม่ถูกตรวจสอบ ตรวจสอบและยกเลิกการเลือก

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