31
บทท 9 การจดการกบขอผดพลาด (Exception Handling) ผศ.ธนศา เครอไวศยวรรณ คณะเทคโนโลย(สารสนเทศ สถาบ,นเทคโนโลย(พระจอมเกล1าเจ1าค2ณทหารลาดกระบ,ง

Java Programming: การจัดการกับข้อผิดพลาด

Embed Size (px)

DESCRIPTION

แนะนำหลักการของการจัดการกับข้อผิดพลาดในภาษาจาวา แนะนำคลาสที่เกี่ยวข้องกับการจัดการกับข้อผิดพลาดที่กำหนดไว้ใน Java API อธิบายคำสั่งที่ใช้ในการจัดการกับข้อผิดพลาดคือคำสั่ง try, catch และ finally อธิบายกฎการจัดการกับข้อผิดพลาด และตอนท้ายของบทจะเป็นการแนะนำการสร้างคลาสประเภทข้อผิดพลาดขึ้นมาใหม่

Citation preview

Page 1: Java Programming: การจัดการกับข้อผิดพลาด

บทท�� 9

การจดการกบข อผ�ดพลาด(Exception Handling)

ผศ.ธน�ศา เคร�อไวศยวรรณคณะเทคโนโลย(สารสนเทศ

สถาบ,นเทคโนโลย(พระจอมเกล1าเจ1าค2ณทหารลาดกระบ,ง

Page 2: Java Programming: การจัดการกับข้อผิดพลาด

ว,ตถ2ประสงค8แนะน:าข1อผ�ดพลาดท(<อาจเก�ดข=>นได1ในภาษาจาวาแนะน:าคลาสท(<เก(<ยวข1องก,บการจ,ดการก,บข1อผ�ดพลาดท(<ก:าหนดไว1ใน Java

API อธ�บายค:าส,<งท(<ใช1ในการจ,ดการก,บข1อผ�ดพลาดค�อ ค:าส,<ง try,catch และ finally

อธ�บายกฎการจ,ดการก,บข1อผ�ดพลาดแนะน:าว�ธ(การสร1างคลาสประเภทข1อผ�ดพลาดข=>นมาใหมI

Page 3: Java Programming: การจัดการกับข้อผิดพลาด

ข อผ�ดพลาดโปรแกรมภาษาจาวาแบ�งข อผ�ดพลาดท��อาจเก�ดข��นขณะรนโปรแกรมเป"นสอง ประเภทค�อ• Error เป"นข อผ�ดพลาดท��ไม�สามารถแก ไขและจดการได เช�น

VirtualMachineError,OutOfMemoryError• Exception เป"นข อผ�ดพลาดท��สามารถแก ไขหร(อจดการได เช�น

ArrayIndexOutOfBoundsException,FileNotFoundExceptionข อผ�ดพลาดในภาษาจาวาจะก*าหนดเป"นออปเจJคของคลาสต�างๆ โดยม�คลาส

Throwable เป"นคลาสราก

Page 4: Java Programming: การจัดการกับข้อผิดพลาด

คลาสท��เก��ยวข องกบข อผ�ดพลาด

Page 5: Java Programming: การจัดการกับข้อผิดพลาด

คลาสประเภท ExceptionException เป"นข อผ�ดพลาดท��เก�ดในขณะรนโปรแกรมภาษาจาวาException แบ�งออกเป"นสองประเภท ค(อ

• RuntimeException• IOException

RuntimeException เป"นข อผ�ดพลาดท��อาจหล�กเล��ยงได หากม�การเข�ยนโปรแกรมท��ถ/กต อง

IOException เป"นข อผ�ดพลาดท��ภาษาจาวาก*าหนดให ต องม�การจดการ หากม�การเร�ยกใช เมธอดท��อาจเก�ดข อผ�ดพลาดประเภทน��ได

Page 6: Java Programming: การจัดการกับข้อผิดพลาด

คลาสประเภท Exception ท(<ส:าค,ญและพบบIอย ArithmeticException ArrayIndexOutOfBoundsException EOFException FileNotFoundException InterruptedException IOException NullPointerException NumberFormatException

Page 7: Java Programming: การจัดการกับข้อผิดพลาด

ตวอย�างโปรแกรมท��อาจเก�ดข อผ�ดพลาด

public class ExceptionDemo {public static void main(String args[]) {

System.out.println(args[2]);System.out.println("Hello");

}}

Page 8: Java Programming: การจัดการกับข้อผิดพลาด

ค*าส�ง try..catchภาษาจาวาม(ค(ย8เว�ร8ด try ท(<เปLนค:าส,<งท(<ใช1ในการจ,ดการก,บเมธอดหร�อค:าส,<ง

ท(<อาจเก�ดข1อผ�ดพลาดซ=<งจะสIงออปเจJคประเภท Exception ในขณะร,นโปรแกรม

รNปแบบtry {

[statements]}

โปรแกรมภาษาจาวาจะส,<งงานช2ดค:าส,<งท(<อยNIในบลJอกท(ละค:าส,<ง และหากเก�ดข1อผ�ดพลาดข=>นในค:าส,<งประเภทใดกJจะม(การสIงออปเจJคของข1อผ�ดพลาดประเภท Exception น,>นข=>นมา

Page 9: Java Programming: การจัดการกับข้อผิดพลาด

ค*าส�ง try..catchในกรณ(ท(<ต1องการจ,ดการก,บข1อผ�ดพลาดท(<เก�ดข=>น โปรแกรมจะต1องม(ช2ดค:า

ส,<งอยNIในบลJอกของค(ย8เว�ร8ด catch ท(<จะระบ2ชน�ดของออปเจJคในคลาสประเภท Exception ท(<ต1องการจ,ดการ

รNปแบบcatch(ExceptionType argumentName){

[statements]}

Page 10: Java Programming: การจัดการกับข้อผิดพลาด

ตวอย�างโปรแกรมท��ม�การจดการกบข อผ�ดพลาด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");

}}

}

Page 11: Java Programming: การจัดการกับข้อผิดพลาด

การจ,ดการก,บข1อผ�ดพลาดหลายๆประเภท โปรแกรมภาษาจาวาสามารถจะม(ช2ดค:าส,<งของบลJอก catch ได1มากกวIา

หน=<งช2ดส:าหร,บในแตIละบลJอกค:าส,<ง try ชน�ดของออปเจJคประเภท Exception ท(<อยNIในช2ดค:าส,<งของบลJอก catch จะ

ต1องเร(ยงตามล:าด,บการส�บทอด ในกรณ(ท(<ม(ข1อผ�ดพลาดเก�ดข=>น ภาษาจาวาจะพ�จารณาวIาเปLนข1อผ�ดพลาด

ชน�ดใด ซ=<งการท(<จะจ,ดการก,บออปเจJคประเภท Exception น,>นจะพ�จารณาจากคลาสท(<ม(การส�บทอดตามล:าด,บช,>น

Page 12: Java Programming: การจัดการกับข้อผิดพลาด

ตวอย�างโปรแกรม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");}

}}

Page 13: Java Programming: การจัดการกับข้อผิดพลาด

ตวอย�างโปรแกรมท��ไม�ถ/กต อง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");}

}}

Page 14: Java Programming: การจัดการกับข้อผิดพลาด

บล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();

Page 15: Java Programming: การจัดการกับข้อผิดพลาด

ตวอย�างโปรแกรม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");

}}

}

Page 16: Java Programming: การจัดการกับข้อผิดพลาด

ตวอย�างโปรแกรม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;}

}}

Page 17: Java Programming: การจัดการกับข้อผิดพลาด

การจ,ดการก,บเมธอดท(<สIงออปเจJคประเภท Exception เราสามารถจะจดการก,บออปเจ2คของ Exception โดยใช คลาสท��เป"น

superclass ของ Exception น�นได อาท�เช�น เราสามารถจดการกบ FileNotFoundException โดยใช IOException หร(อ Exception แทนได

การจดการก,บ Exception ม�สองแบบ ค(อ• ใช ค*าส�ง try/catch• ใช ค*าส�ง throws ในการประกาศเมธอดท(<จะม(การเร(ยกใช1เมธอดใดๆท(<อาจสIง

ออปเจJคประเภท Exception

Page 18: Java Programming: การจัดการกับข้อผิดพลาด

ค:าส,<ง throws รNปแบบการใช1ค:าส,<ง throws ม(ด,งน(>

[modifier] return_type methodName([arguments]) throwsExceptionType[,ExceptionType2] {

...}

ตวอย�างpublic void openfile(String s) throws

FileNotFoundException {...

}

Page 19: Java Programming: การจัดการกับข้อผิดพลาด

ค:าส,<ง 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าวเก�ดข=>น

Page 20: Java Programming: การจัดการกับข้อผิดพลาด

ตวอย�างโปรแกรมท(<ไม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);}

}

Page 21: Java Programming: การจัดการกับข้อผิดพลาด

กฎของการก:าหนดเมธอดแบบ overridenเมธอดแบบ overriden จะไมIอน2ญาตให1ม(การจ,ดการออปเจJคประเภท

Exception โดยใช1ค:าส,<ง throws มากชน�ดกวIาท(<เมธอดเด�มจ,ดการอยNIได1

Page 22: Java Programming: การจัดการกับข้อผิดพลาด

ตวอย�างโปรแกรมท(<ม(เมธอดแบบ 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");

}}

Page 23: Java Programming: การจัดการกับข้อผิดพลาด

ตวอย�างโปรแกรมท(<ม(เมธอดแบบ 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");}

}

Page 24: Java Programming: การจัดการกับข้อผิดพลาด

การสร างคลาสประเภท 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);

Page 25: Java Programming: การจัดการกับข้อผิดพลาด

ตวอย�างคลาสประเภท Exception ท(<ก:าหนดข��นใหม�public class MyOwnException extends Exception {

public MyOwnException (String s) {super(s);

}}

Page 26: Java Programming: การจัดการกับข้อผิดพลาด

การเข(ยนเมธอดเพ�<อส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อผ�ดพลาดน(>

Page 27: Java Programming: การจัดการกับข้อผิดพลาด

ตวอย�างคลาส 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"); }

}}

Page 28: Java Programming: การจัดการกับข้อผิดพลาด

ตวอย�างโปรแกรมท(<ม(การจ,ดการก,บข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);

} }

}

Page 29: Java Programming: การจัดการกับข้อผิดพลาด

สร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าน,>น

Page 30: Java Programming: การจัดการกับข้อผิดพลาด

สร2ปเน�>อหาของบทค*าส�ง throws จะใสIไว1ตรงค*าส�งประกาศเมธอด ส:าหร,บเมธอดท(<ย,งไมI

ต1องการจ,ดการก,บข1อผ�ดพลาดแตIจะให1เมธอดท��เร�ยกใช1เมธอดน(> เป"นตวจดการแทน

เราสามารถสร1างคลาสประเภท Exception ชน�ดใหมIข=>นได1 โดยจะต1องส�บทอดมาจากคลาสท(<ช�<อ Exception และต1องม(การเร(ยกใช1 Constructor ของคลาส Exception ด1วย

Page 31: Java Programming: การจัดการกับข้อผิดพลาด

แบบฝVกห,ดข1อท(< 1

• ทดลองเข(ยนโปรแกรมเพ�<อจ,ดการก,บข1อผ�ดพลาด อาท�เชIน IOException ArrayIndexOutOfBoundsException

ข1อท(< 2• ทดลองเข(ยนโปรแกรมเพ�<อสร1างคลาสของข1อผ�ดพลาดข=>นมาใหมI โดยยกต,วอยIาง

โปรแกรม Account