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

Preview:

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