Upload
thanachart-numnonda
View
5.770
Download
2
Embed Size (px)
DESCRIPTION
แนะนำหลักการของการจัดการกับข้อผิดพลาดในภาษาจาวา แนะนำคลาสที่เกี่ยวข้องกับการจัดการกับข้อผิดพลาดที่กำหนดไว้ใน Java API อธิบายคำสั่งที่ใช้ในการจัดการกับข้อผิดพลาดคือคำสั่ง try, catch และ finally อธิบายกฎการจัดการกับข้อผิดพลาด และตอนท้ายของบทจะเป็นการแนะนำการสร้างคลาสประเภทข้อผิดพลาดขึ้นมาใหม่
Citation preview
บทท�� 9
การจดการกบข อผ�ดพลาด(Exception Handling)
ผศ.ธน�ศา เคร�อไวศยวรรณคณะเทคโนโลย(สารสนเทศ
สถาบ,นเทคโนโลย(พระจอมเกล1าเจ1าค2ณทหารลาดกระบ,ง
ว,ตถ2ประสงค8แนะน:าข1อผ�ดพลาดท(<อาจเก�ดข=>นได1ในภาษาจาวาแนะน:าคลาสท(<เก(<ยวข1องก,บการจ,ดการก,บข1อผ�ดพลาดท(<ก:าหนดไว1ใน Java
API อธ�บายค:าส,<งท(<ใช1ในการจ,ดการก,บข1อผ�ดพลาดค�อ ค:าส,<ง try,catch และ finally
อธ�บายกฎการจ,ดการก,บข1อผ�ดพลาดแนะน:าว�ธ(การสร1างคลาสประเภทข1อผ�ดพลาดข=>นมาใหมI
ข อผ�ดพลาดโปรแกรมภาษาจาวาแบ�งข อผ�ดพลาดท��อาจเก�ดข��นขณะรนโปรแกรมเป"นสอง ประเภทค�อ• Error เป"นข อผ�ดพลาดท��ไม�สามารถแก ไขและจดการได เช�น
VirtualMachineError,OutOfMemoryError• Exception เป"นข อผ�ดพลาดท��สามารถแก ไขหร(อจดการได เช�น
ArrayIndexOutOfBoundsException,FileNotFoundExceptionข อผ�ดพลาดในภาษาจาวาจะก*าหนดเป"นออปเจJคของคลาสต�างๆ โดยม�คลาส
Throwable เป"นคลาสราก
คลาสท��เก��ยวข องกบข อผ�ดพลาด
คลาสประเภท ExceptionException เป"นข อผ�ดพลาดท��เก�ดในขณะรนโปรแกรมภาษาจาวาException แบ�งออกเป"นสองประเภท ค(อ
• RuntimeException• IOException
RuntimeException เป"นข อผ�ดพลาดท��อาจหล�กเล��ยงได หากม�การเข�ยนโปรแกรมท��ถ/กต อง
IOException เป"นข อผ�ดพลาดท��ภาษาจาวาก*าหนดให ต องม�การจดการ หากม�การเร�ยกใช เมธอดท��อาจเก�ดข อผ�ดพลาดประเภทน��ได
คลาสประเภท Exception ท(<ส:าค,ญและพบบIอย ArithmeticException ArrayIndexOutOfBoundsException EOFException FileNotFoundException InterruptedException IOException NullPointerException NumberFormatException
ตวอย�างโปรแกรมท��อาจเก�ดข อผ�ดพลาด
public class ExceptionDemo {public static void main(String args[]) {
System.out.println(args[2]);System.out.println("Hello");
}}
ค*าส�ง try..catchภาษาจาวาม(ค(ย8เว�ร8ด try ท(<เปLนค:าส,<งท(<ใช1ในการจ,ดการก,บเมธอดหร�อค:าส,<ง
ท(<อาจเก�ดข1อผ�ดพลาดซ=<งจะสIงออปเจJคประเภท Exception ในขณะร,นโปรแกรม
รNปแบบtry {
[statements]}
โปรแกรมภาษาจาวาจะส,<งงานช2ดค:าส,<งท(<อยNIในบลJอกท(ละค:าส,<ง และหากเก�ดข1อผ�ดพลาดข=>นในค:าส,<งประเภทใดกJจะม(การสIงออปเจJคของข1อผ�ดพลาดประเภท Exception น,>นข=>นมา
ค*าส�ง try..catchในกรณ(ท(<ต1องการจ,ดการก,บข1อผ�ดพลาดท(<เก�ดข=>น โปรแกรมจะต1องม(ช2ดค:า
ส,<งอยNIในบลJอกของค(ย8เว�ร8ด catch ท(<จะระบ2ชน�ดของออปเจJคในคลาสประเภท Exception ท(<ต1องการจ,ดการ
รNปแบบcatch(ExceptionType argumentName){
[statements]}
ตวอย�างโปรแกรมท��ม�การจดการกบข อผ�ดพลาดpublic class ExceptionHandlingDemo {
public static void main(String args[]) {try {
System.out.println(args[2]);} catch(ArrayIndexOutOfBoundsException ex) {
System.out.println("There is no third command line argument");
}}
}
การจ,ดการก,บข1อผ�ดพลาดหลายๆประเภท โปรแกรมภาษาจาวาสามารถจะม(ช2ดค:าส,<งของบลJอก catch ได1มากกวIา
หน=<งช2ดส:าหร,บในแตIละบลJอกค:าส,<ง try ชน�ดของออปเจJคประเภท Exception ท(<อยNIในช2ดค:าส,<งของบลJอก catch จะ
ต1องเร(ยงตามล:าด,บการส�บทอด ในกรณ(ท(<ม(ข1อผ�ดพลาดเก�ดข=>น ภาษาจาวาจะพ�จารณาวIาเปLนข1อผ�ดพลาด
ชน�ดใด ซ=<งการท(<จะจ,ดการก,บออปเจJคประเภท Exception น,>นจะพ�จารณาจากคลาสท(<ม(การส�บทอดตามล:าด,บช,>น
ตวอย�างโปรแกรมpublic class ExceptionHandlingDemoV2 {
public static void main(String args[]) {try {
int i = Integer.parseInt(args[0]);System.out.println(4 / i);
} catch(ArithmeticException ex) {System.out.println(ex.toString());
} catch(NumberFormatException ex) {System.out.println("Invalid numeric
format");}
}}
ตวอย�างโปรแกรมท��ไม�ถ/กต องpublic class ExceptionHandlingDemoV3 {
public static void main(String args[]) {try {
int i = Integer.parseInt(args[0]);System.out.println(4 / i);System.out.println(args[2]);
} catch(RuntimeException ex) {System.out.println(ex.toString());
} catch(ArrayIndexOutOfBoundsException ex) {System.out.println("There is no third
command line argument");}
}}
บลJอก finallyภาษาจาวาม(ค(ย8เว�ร8ด finally ท(<จะม(ช2ดค:าส,<งอยNIในบลJอกเพ�<อระบ2ให1
โปรแกรมท:าช2ดค:าส,<งด,งกลIาวหล,งจากส�>นส2ดการท:างานของช2ดค:าส,<งในบลJอก try หร�อ catch
ภาษาจาวาจะท*าช1ดค*าส�งในบล2อก finally เสมอ แม ว�าจะม(ค*าส�ง return ในบล2อก try หร(อ catch กIอนกJตาม กรณ�เด�ยวท��จะไม�ท*าช1ดค*าส�งในบล2อก finally ค(อม(ค*าส�ง System.exit();
ตวอย�างโปรแกรมpublic class FinallyDemo {
public static void main(String args[]) {try {
System.out.println(args[2]);System.out.println("Hello");
} catch(ArrayIndexOutOfBoundsException ex) {System.out.println("There is no third
argument");} finally {
System.out.println("Finish running the program");
}}
}
ตวอย�างโปรแกรมpublic class FinallyDemoV2 {
public static void main(String args[]) {FinallyDemoV2 obj = new FinallyDemoV2();obj.myMethod(args);
} public int myMethod(String args[]) {
try {System.out.println(args[2]);return 0;
} catch(ArrayIndexOutOfBoundsException ex) {System.out.println("There is no third
argument");} finally {
System.out.println("Finish running the program");
return 1;}
}}
การจ,ดการก,บเมธอดท(<สIงออปเจJคประเภท Exception เราสามารถจะจดการก,บออปเจ2คของ Exception โดยใช คลาสท��เป"น
superclass ของ Exception น�นได อาท�เช�น เราสามารถจดการกบ FileNotFoundException โดยใช IOException หร(อ Exception แทนได
การจดการก,บ Exception ม�สองแบบ ค(อ• ใช ค*าส�ง try/catch• ใช ค*าส�ง throws ในการประกาศเมธอดท(<จะม(การเร(ยกใช1เมธอดใดๆท(<อาจสIง
ออปเจJคประเภท Exception
ค:าส,<ง throws รNปแบบการใช1ค:าส,<ง throws ม(ด,งน(>
[modifier] return_type methodName([arguments]) throwsExceptionType[,ExceptionType2] {
...}
ตวอย�างpublic void openfile(String s) throws
FileNotFoundException {...
}
ค:าส,<ง throwsเมธอดใดๆสามารถท��จะจดการก,บ Exception โดยใช ค*าส�ง throws ได
มากกว�าหน��งประเภทต,วอยIาง
public void openFile(String s)throws FileNotFoundException,UnknownHostException {
... }กรณ�ท��ม�การใช ค*าส�ง throws ส�งต�อไปเร(�อยๆ แล วเมธอด main() ซ=<งเร(ยก
ใช1เมธอดส2ดท1ายท(<ใช1ค:าส,<ง throws ไมIม(การจ,ดการก,บออปเจJคประเภท Exception ด,งกลIาว โปรแกรมจะเก�ดข1อผ�ดพลาดในข,>นตอนการร,นโปรแกรม เม�<อม(ข1อผ�ดพลาดของออปเจJคประเภท Exception ด,งกลIาวเก�ดข=>น
ตวอย�างโปรแกรมท(<ไมIม(การจ,ดการก,บ Exception public class ExceptionDemo1 {
public static void main(String args[]) {ExceptionDemo1 ex1 = new ExceptionDemo1();ex1.method1();
}public void method1() throws ArithmeticException {
method2();}public void method2() throws ArithmeticException {
System.out.println(2/0);}
}
กฎของการก:าหนดเมธอดแบบ overridenเมธอดแบบ overriden จะไมIอน2ญาตให1ม(การจ,ดการออปเจJคประเภท
Exception โดยใช1ค:าส,<ง throws มากชน�ดกวIาท(<เมธอดเด�มจ,ดการอยNIได1
ตวอย�างโปรแกรมท(<ม(เมธอดแบบ overriden ท(<ถNกต1อง import java.io.*;public class Parent {
public void myMethods() throws IOException { }}___________________________________________________________public class OverrideException extends Parent{
public void myMethods() throws IOException {new FileInputStream("temp.txt");
}}
ตวอย�างโปรแกรมท(<ม(เมธอดแบบ overriden ท(<ไมIถNกต1อง import java.io.*;public class Parent { public void myMethods() throws FileNotFoundException { }}__________________________________public class OverrideExceptionV2 extends Parent {
public void myMethods() throws FileNotFoundException,IOException {
new FileInputStream("temp.txt");}
}
การสร างคลาสประเภท Exception ข��นใหม�การสร1างคลาสประเภท Exception ข=>นมาใหมI สามารถท:าได1โดยน�ยามคลาส
ใดๆให1ส�บทอดมาจากคลาสท(<ช�<อ Exception โดยท,<วไปคลาสท(<ช�<อ Exception จะม( constructor สองรNปแบบค�อ
• public Exception()• public Exception(String s)
ด,งน,>นคลาสท(<ส�บทอดมาจากคลาสท(<ช�<อ Exception ควรจะม( constructor ท,>งสองแบบ โดยรNปแบบหน=<งจะม( argument ท(<ม(ชน�ดข1อมNลเปLน String และม(ค:าส,<งแรกใน constructor เปLนค:าส,<ง super(s);
ตวอย�างคลาสประเภท Exception ท(<ก:าหนดข��นใหม�public class MyOwnException extends Exception {
public MyOwnException (String s) {super(s);
}}
การเข(ยนเมธอดเพ�<อสIงออปเจJคประเภท Exceptionเมธอดท(<ต1องการสIงออปเจJคประเภท Exception เม�<อเก�ดข1อผ�ดพลาดข=>นใน
ค:าส,<งใด จะต1องเร(ยกใช1ค:าส,<งท(<ช�<อ throw เพ�<อจะสร1างออปเจJคของคลาสประเภท Exception ข=>นมา
รNปแบบthrow new ExceptionType([arguments])
นอกจากน(>ค:าส,<งประกาศเมธอดน,>นจะต1องม(ค:าส,<ง throws เพ�<อก:าหนดให1ค:าส,<งในเมธอดอ�<นๆท(<เร(ยกใช1เมธอดน(>ต1องเข(ยนค:าส,<งในการจ,ดการก,บข1อผ�ดพลาดน(>
ตวอย�างคลาส FileHandlerimport java.io.*;public class FileHandler { public static void openFile(String filename) throws
MyOwnException { File f = new File(filename); if (!f.exists()) {
throw new MyOwnException("File Not Found"); }
}}
ตวอย�างโปรแกรมท(<ม(การจ,ดการก,บข1อผ�ดพลาดpublic class FileOpener {
public static void main (String args[]) {try {
FileHandler.openFile(args[0]);System.out.println("Open successful");
} catch (MyOwnException ex) {System.err.println(ex);
} }
}
สร2ปเน�>อหาของบทข1อด(ประเภทหน=<งของภาษาจาวาค�อ เราสามารถเข(ยนโปรแกรมให1ม(การ
ตรวจจ,บและจ,ดการก,บข1อผ�ดพลาดท(<อาจเก�ดข=>นได1 โดยท(<การท:างานไมIต1องหย2ดลง
Error เป"นข อผ�ดพลาดท��ไม�สามารถแก ไขและจดการได สIวน Exception เป"นข อผ�ดพลาดท��สามารถแก ไขหร(อจดการได
ค:าส,<ง try และ catch เปLนค:าส,<งท(<ใช1ในการตรวจจ,บและจ,ดการก,บข1อผ�ดพลาดท(<อาจเก�ดข=>นได1 โดยบลJอกค:าส,<ง catch สามารถม(ได1มากกวIาหน=<งบลJอกส:าหร,บในแตIละบลJอกค:าส,<ง try
ค:าส,<ง finally เปLนค:าส,<งท(<อยNIตIอจากค:าส,<ง try/catch ถNกเร(ยกใช1เสมอ ยกเว1นเจอค:าส,<ง System.exit(0); กIอนเทIาน,>น
สร2ปเน�>อหาของบทค*าส�ง throws จะใสIไว1ตรงค*าส�งประกาศเมธอด ส:าหร,บเมธอดท(<ย,งไมI
ต1องการจ,ดการก,บข1อผ�ดพลาดแตIจะให1เมธอดท��เร�ยกใช1เมธอดน(> เป"นตวจดการแทน
เราสามารถสร1างคลาสประเภท Exception ชน�ดใหมIข=>นได1 โดยจะต1องส�บทอดมาจากคลาสท(<ช�<อ Exception และต1องม(การเร(ยกใช1 Constructor ของคลาส Exception ด1วย
แบบฝVกห,ดข1อท(< 1
• ทดลองเข(ยนโปรแกรมเพ�<อจ,ดการก,บข1อผ�ดพลาด อาท�เชIน IOException ArrayIndexOutOfBoundsException
ข1อท(< 2• ทดลองเข(ยนโปรแกรมเพ�<อสร1างคลาสของข1อผ�ดพลาดข=>นมาใหมI โดยยกต,วอยIาง
โปรแกรม Account