แม้โปรแกรมเมอร์เก่งที่สุดก็ยังเขียนโค้ดผิดพลาดได้ ข้อผิดพลาดอาจมาจาก typo, อินพุตจากผู้ใช้ที่ไม่คาดคิด หรือสาเหตุอื่นๆ ที่ติดตามยาก
ที่นี่ การจัดการข้อยกเว้น (Exception Handling) เข้ามาช่วย โค้ดที่ดีควรมี exception handlers ที่ตอบสนองต่อข้อผิดพลาดแบบกำหนดไว้ล่วงหน้า มีประโยชน์เพราะบอกโปรแกรมว่าต้องทำอย่างไรเมื่อเกิดข้อผิดพลาด
ใน Java ใช้บล็อก try...catch สำหรับจัดการข้อยกเว้น บทช่วยสอนนี้อธิบายพื้นฐาน การใช้ try-catch และคำสั่ง finally พร้อมตัวอย่าง
ข้อยกเว้น (Exceptions) ใน Java
Exceptions คือเหตุการณ์ไม่คาดคิดระหว่างรันโปรแกรม ขัดจังหวะการทำงาน และอาจทำให้โปรแกรมหยุดก่อนเสร็จ
สาเหตุหลากหลาย: เข้าถึงเซิร์ฟเวอร์ไม่ได้, ข้อผิดพลาดโค้ด, typo, เปิดไฟล์ไม่มีอยู่, อินพุตผิดจากผู้ใช้ ฯลฯ
Error vs Exception: Error คือสภาวะที่โปรแกรมกู้คืนไม่ได้ (เช่น หน่วยความจำเต็ม) ไม่ได้จัดการโดยนักพัฒนาปกติ แต่ Exception เป็นปัญหาในโปรแกรมที่จัดการได้ เมื่อเกิด exception จะสร้าง exception object เก็บข้อมูล เช่น ชื่อ exception และตำแหน่งที่เกิด
Try-Catch ใน Java
คำสั่ง try...catch ใช้จัดการ exceptions วางโค้ดที่อาจเกิดข้อผิดพลาดไว้ในบล็อก try ตามด้วย catch
เมื่อเจอ try-catch โปรแกรมจะรันโค้ดใน try ก่อน หากเกิด exception โค้ดใน catch จะรันทันที catch ต้องอยู่หลัง try เสมอ
ไวยากรณ์:
try {
// Code to run
} catch (ExceptionType error) {
// Code to run when exception is raised
} finally {
// Code to run even if exception is not raised
}
บล็อก finally จะกล่าวถึงต่อไป ตอนนี้เน้น try-catch ก่อน
ตัวอย่าง Try-Catch
สร้างโปรแกรมมีอาร์เรย์ studentNames 6 คน ต้องการพิมพ์คนที่ 5 (index 5 = คนที่ 6) แต่มีแค่ 5 คน -> เกิด error
class Main {
public static void main(String[] args) {
String[] studentNames = {"Linda", "Greg", "Ron", "Graham", "Alexis"};
System.out.println(studentNames[5]);
}
}
ผลลัพธ์: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 5
ใช้ try-catch จัดการ: เมื่อ error ให้พิมพ์ "There was an error."
class Main {
public static void main(String[] args) {
try {
String[] studentNames = {"Linda", "Greg", "Ron", "Graham", "Alexis"};
System.out.println(studentNames[5]);
} catch (Exception e) {
System.out.println("There was an error.");
}
}
}
ผลลัพธ์: There was an error.
สามารถมีหลาย catch blocks เพื่อจัดการ exception แต่ละประเภทต่างกัน
ตัวอย่าง: catch ArrayIndexOutOfBoundsException แบบเฉพาะเจาะจง และ catch Exception ทั่วไป
class Main {
public static void main(String[] args) {
try {
String[] studentNames = {"Linda", "Greg", "Ron", "Graham", "Alexis"};
System.out.println(studentNames[5]);
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("ArrayIndexOutOfBoundsException was raised.");
} catch (Exception e) {
System.out.println("There was an error.");
}
}
}
ผลลัพธ์: ArrayIndexOutOfBoundsException was raised. เพราะ exception นี้เกิดจริง หาก error อื่น จะเข้า catch ทั่วไป พิมพ์ "There was an error."
คำสั่ง Finally
finally ใช้รันโค้ดหลัง try-catch เสร็จสิ้น เป็น optional และ รันเสมอ ถ้าประกาศไว้ ไม่ว่า exception จะเกิดหรือไม่ก็ตาม ไม่เกิด -> รันหลัง try block เกิด -> รันหลัง catch block
ตัวอย่าง: เพิ่ม finally พิมพ์ "This block has finished executing."
class Main {
public static void main(String[] args) {
try {
String[] studentNames = {"Linda", "Greg", "Ron", "Graham", "Alexis"};
System.out.println(studentNames[5]);
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("ArrayIndexOutOfBoundsException was raised.");
} catch (Exception e) {
System.out.println("There was an error.");
} finally {
System.out.println("This block of code has finished executing.");
}
}
}
ผลลัพธ์:
ArrayIndexOutOfBoundsException was raised. This block of code has finished executing.
เห็นว่า catch ทำงาน แล้ว finally ทำงานต่อท้าย
สรุป
บล็อก try...catch ใช้จัดการ exceptions อย่างสง่างาม โค้ดใน try รัน กรณีมี exception -> catch ที่ตรงกันรัน นอกจากนี้ finally รันหลัง try-catch เสร็จ แม้ไม่มี exception ก็ตาม บทช่วยสอนนี้อธิบาย try-catch และ finally พร้อมตัวอย่าง ตอนนี้คุณจัดการ exceptions ใน Java ได้อย่างมั่นใจแล้ว!