กลัวข้อผิดพลาด แต่อย่าเขียนใน Java! คุณอาจทราบบางอย่างเกี่ยวกับข้อยกเว้นใน Javaแล้ว วันนี้อย่างน้อยความรู้เพียงผิวเผินจะเป็นประโยชน์ต่อคุณ เราจะวิเคราะห์คลาส Error และประเภทข้อยกเว้นพิเศษที่ทำให้หลายคนตกใจเมื่อปรากฏในสแต็กเทรซ
ที่ด้านบนสุดของลำดับชั้นข้อยกเว้นของ Java คือ คลาส Throwableซึ่งมีสองลำดับชั้น:
- ข้อยกเว้นซึ่งรับผิดชอบต่อข้อผิดพลาดในโปรแกรมของคุณ
- และฮีโร่ของเราในวันนี้ — ข้อผิดพลาดซึ่งรับผิดชอบข้อผิดพลาดใน JVM
เป็นมูลค่าการกล่าวขวัญว่าสิ่งเหล่านี้อาจไม่ใช่ข้อผิดพลาดในการเข้ารหัส แต่เป็นปัญหาที่มักไม่ขึ้นอยู่กับผู้พัฒนา
จะทำอย่างไรกับข้อผิดพลาด
เมื่อตรวจพบ "ข้อผิดพลาด" คุณจะไม่สามารถดำเนินการใดๆ ในcatch block ได้ ยกเว้นการบันทึกเนื่องจากเรากำลังพูดถึงปัญหาใน JVM เอง
การบันทึกเป็นสิ่งที่ดี: เมื่อคุณได้รับข้อผิดพลาดรันไทม์ คุณสามารถดูบันทึก ดูสาเหตุ และรู้ว่าต้องแก้ไขอะไร
เนื่องจากคุณไม่รู้ว่าคุณอาจได้รับข้อผิดพลาดประเภทใดเมื่อคุณเขียนโค้ด จึงไม่มีเหตุผลที่จะเขียนประเภทใดประเภทหนึ่งลงในcatch block การใช้ คลาส Errorนั้นไม่ใช่วิธีแก้ปัญหาที่ดีที่สุด เนื่องจากในกรณีนี้ คุณจะตรวจจับได้เฉพาะข้อผิดพลาดเท่านั้น
ดังนั้นจึงเป็นการดีกว่าถ้าใช้คลาสThrowableซึ่งสามารถตรวจจับได้ทั้งErrorและException สิ่งนี้มีลักษณะอย่างไรในทางปฏิบัติ?
การเขียนโค้ดแบบนี้ไม่ถูกต้อง: |
---|
|
การเขียนโค้ดแบบนี้ก็ไม่เป็นไรเช่นกัน: |
---|
|
แต่รหัสเช่นนี้ก็โอเค: |
---|
|
ตัวเลือกที่สองสำหรับการจัดการข้อผิดพลาดคือการโยนให้สูงขึ้นหลังจากประกาศ คำสั่ง โยนในเมธอด เทคนิคนี้ใช้เมื่อโค้ดของคุณอาจเกิดข้อผิดพลาดในทางทฤษฎี และคุณต้องการเตือนทุกคนที่อาจใช้โค้ดของคุณล่วงหน้า เพื่อให้พวกเขาสามารถจัดการกับข้อผิดพลาดได้อย่างเหมาะสม
ข้อผิดพลาดทั่วไป
ข้อผิดพลาดยอดนิยมบางส่วน ได้แก่คลาสOutOfMemoryErrorและStackOverflowError
OutOfMemoryErrorมักจะปรากฏขึ้นเมื่อโปรแกรมมีหน่วยความจำไม่เพียงพอสำหรับสร้างอ็อบเจกต์และตัวเก็บขยะไม่สามารถเก็บได้ทัน ผลลัพธ์คือ OutOfMemoryError
Java ไม่อนุญาตให้คุณลบออบเจกต์ด้วยตนเองเพื่อป้องกันการรั่วไหลของหน่วยความจำ แต่คุณสามารถหลีกเลี่ยงการทิ้งขยะเพื่อไม่ให้คนเก็บขยะทำงานหนักเกินไปและไม่ทำให้กองขยะยุ่งเหยิง
ตัวอย่างเช่น โค้ดแบบนี้จะสร้างขยะจำนวนมากในหน่วยความจำ:
while (true) {
new Object();
}
ข้อผิดพลาดที่สองที่ฉันอยากจะบอกคุณคือStackOverflowErrorซึ่งเกิดขึ้นเมื่อสแต็กโอเวอร์โฟลว์ เนื่องจากสแต็กส่วนใหญ่เก็บตัวแปรโลคัล พารามิเตอร์ และการเรียกใช้เมธอด การเรียกซ้ำ (หรือการเรียกเมธอดแบบเรียกซ้ำ) จึงเป็นสาเหตุที่พบบ่อยมากของข้อผิดพลาดนี้:
public void foo() {
foo();
}
เพื่อหลีกเลี่ยงปัญหาระหว่างการทำงานของโปรแกรม IDEs สมัยใหม่มักจะเตือนเกี่ยวกับการเรียกใช้เมธอดแบบวนซ้ำ
คุณไม่สามารถแก้ไขโปรแกรมที่ส่ง ข้อผิดพลาด Errorsได้ แต่คุณสามารถเขียนโค้ดที่จะไม่ส่งข้อผิดพลาดและทำให้โปรแกรมของคุณเสียหายได้ ดูสิ่งที่คุณทำกับหน่วยความจำ สร้างวัตถุอย่างระมัดระวัง และเรียกใช้เมธอดอย่างถูกต้อง หากคุณทำเช่นนั้น คุณจะมีปัญหาน้อยลงในโค้ดของคุณ
ความแตกต่างระหว่างประเภทข้อผิดพลาดและข้อยกเว้น
ข้อผิดพลาด | ข้อยกเว้น |
---|---|
ไม่สามารถแก้ไขในcatch block | สามารถจัดการได้ในcatch block |
ไม่เกิดขึ้นในขณะรวบรวม | สามารถจับได้ในเวลารวบรวม |
ปัญหาใน JVM | ปัญหาในตรรกะรหัส |
ข้อผิดพลาดทั้งหมดไม่ถูกตรวจสอบ | ตรวจสอบและยกเลิกการเลือก |
คุณไม่สามารถหลีกเลี่ยงข้อยกเว้นใน Java ได้ แต่คุณไม่ควรกลัวข้อยกเว้น คุณเพียงแค่ต้องเข้าใจว่าแต่ละประเภทหมายถึงอะไรและรู้วิธีจัดการกับมัน นั่นคือทั้งหมดสำหรับวันนี้! พบกันใหม่!
GO TO FULL VERSION