Object Oriented Programming Handling Exceptions
Chapter Objectives See how a try/catch block is used to handle exceptions Discover how to throw and rethrow an exception Learn how to handle events in a program
Exception Exception คือ ความผิดพลาดที่เกิดขึ้นในขณะที่โปรแกรมกำลังทำงานซึ่งสามารถตรวจสอบความผิดพลาดที่เกิดขึ้นได้ เช่น การหารตัวเลขใด ๆ ด้วยศูนย์ เช่น 3/0 พยายามเปิดไฟล์ที่ไม่มีในโฟล์เดอร์ของเรา อ้างอิงถึงข้อมูลใน Array ที่อยู่นอกเหนือจากที่มีอยู่
Java’s Exception Class Exception Class คือ class ที่ใช้ในการตรวจสอบความผิดพลาดในการทำงานในระหว่างที่ execute-time ซึ่งสามารถแบ่งความผิดพลาดได้หลายอย่างดังนี้ I/O exceptions Number format exceptions File not found exceptions Array index out of bounds exceptions ในขณะที่ java กำลังทำงาน หากมีความผิดพลาดเกิดขึ้น java ก็จะสร้าง instance ของ class Exception แล้วโยน (throw) ความผิดพลาดนั้นไปยังตำแหน่งที่เกิดความผิดพลาด
ตัวอย่าง Exception Classes
Exception ที่สําคัญและพบบ่อยในการเขียนโปรแกรมภาษาจาวา มีดังนี้ NullPointerException เป็นข้อผิดพลาดที่เกิดจากการเรียกใช้ออบเจกที่ยังไม่ได้ถูกสร้าง (ออบเจกมีค่าเป็น null) ArithmeticException เป็นข้อผิดพลาดที่เกิดจากการหารจํานวนต็มด้วย 0 ArrayIndexOutOfBoundsException เป็นข้อผิดพลาดที่เกิดจากการอ้างอิงสมาชิกในอะเรยไม่ถูกต้อง (น้อยกว่า 0 หรือเกินกว่าสมชิกของอะเรย์ที่มีอยู่)
NumberFormatException เป็นข้อผิดพลาดที่เกิดจากรูปแบบตัวเลขที่ใช้ไม่ถูกต้อง FileNotFoundException เป็นการระบุว่าไม่พบไฟล์ที่ต้องการ EOFException เป็นการระบุว่าตําแหน่งสิ้นสุดของไฟล์ผ่านมาแล้ว IOException เป็นข้อผิดพลาดที่เกิดจากการรับและส่งข้อมูล
Example Exception Throw public class ExceptionDemo { public static void main(String args[]) int a,b,c; a = 5; b = 0; c = a/b; System.out.println(c); }
Example Exception Throw (cont.) public class ExceptionDemo { public static void main(String args[]) int a[] = {1,2,3}; System.out.println(a[-1]); }
การจัดการกับขอผิดพลาดที่เกิดขึ้น (Exception Handling) ในภาษาจาวามีชุดคําสั่งในการจัดการขอผิดพลาด • try-catch • throw
try-catch • รูปแบบ try-catch บล็อก try คือการจัดการกลุมคําสั่งที่อาจเกิดขอผิดพลาด จะทําการสงออบเจกต Exception เพื่อสงไปจัดการตอไป บล็อก catch คือคําสั่งภายในบล็อกจะทําการจัดการกับขอผิดพลาดที่เกิดขึ้น โดยจะตองระบุชนิดออบเจกตของคลาส Exception ที่ตองการจัดการ
[statements] ที่อยู่ในบล็อก try คือประโยคคําสั่งที่อาจเกิดขอผิดพลาด ExceptionType คือคลาสประเภท Exception ที่ต้องจัดการเมื่อมีข้อผิดพลาดเกิดขึ้น parameterExceptionName คือชื่อออบเจกที่เป็นพารามิเตอร์ที่ใช้จัดการข้อผิดพลาดในบล็อก catch [statements] ที่อยู่ในบล็อก catch คือประโยคคําสั่งที่จัดการกับข้อผิดพลาดของออบเจกชื่อ parameterExceptionName
การจัดการ Exceptions ด้วย Java การดักจับ exception ต้องใช้คำสั่ง try-catch block ดังนี้ try{ //statements } catch(ExceptionClassName1 objRef1){ //exception handler code catch(ExceptionClassName2 objRef2){ ... catch(ExceptionClassNameN objRefN){ finally{
ตัวอย่างการใช้ try-catch block public class ExceptionDemo { public static void main(String args[]){ int a,b,c; a = 5; b = 0; try{ c = a/b; System.out.println(c); } catch(ArithmeticException e){ System.out.println(e); finally{ System.out.println("End");
ตัวอย่างการใช้ try-catch block (cont.) public class ExceptionDemo { public static void main(String args[]) int a[] = {1,2,3}; try{ System.out.println(a[4]); } catch(ArithmeticException e){ System.out.println(e); catch(ArrayIndexOutOfBoundsException e){ finally{ System.out.println("End");
ตัวอย่างการใช้ try-catch block (cont.) ถ้าเราไม่ทราบชื่อหรือจำชื่อคลาสของ exception ที่ดักจับไม่ได้เราก็ใช้ Exception เป็นพารามิเตอร์ของ Catch block แทนได้ public class ExceptionDemo { public static void main(String args[]) int a[] = {1,2,3}; try{ System.out.println(a[4]); } catch(Exception e){ System.out.println(e); finally{ System.out.println("End");
Finally Block โดยปกติโปรแกรมจะดำเนินงานใน try block หรือ catch block แล้วจะต้องดำเนินคำสั่งสุดท้ายเสมอก็คือ finally block เพื่อการทำงานบางอย่างเช่น ปิดไฟล์ หรือ คืนหน่วยความจำให้กับระบบ เป็นต้น
ตัวอย่าง finally block public class ExceptionDemo { public static void main(String args[]){ for(int i = -2;i <= 2 ;i++) try{ System.out.println(10/i); } catch(Exception e){ System.out.println("Catch Block"); break; finally{ System.out.println("Finally Block");