ภาษาจาวา – exception & assertionsomchai/spj/slides/... ·...

43
ภาษาจาวา – Exception & Assertion สมชาย ประสิทธิ์จูตระกูล

Upload: others

Post on 27-Sep-2020

2 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: ภาษาจาวา – Exception & Assertionsomchai/spj/slides/... · ภาษาจาวา – Exception & Assertion สมชาย ประสิทธิ์จูตระก

ภาษาจาวา – Exception & Assertion

สมชาย ประสทธจตระกล

Page 2: ภาษาจาวา – Exception & Assertionsomchai/spj/slides/... · ภาษาจาวา – Exception & Assertion สมชาย ประสิทธิ์จูตระก

© S.Prasitjutrakul 2004 16/01/48 2

อะไร ๆ กเกดขนได

readFile() {

open the file;

allocate memory;

read the file into memory;

close the file;

}

readFile() {

open the file;

allocate memory;

read the file into memory;

close the file;

}

ไมมแฟมใหเปด

หนวยความจาไมพอ

อานไมสาเรจ

ปดไมได

Page 3: ภาษาจาวา – Exception & Assertionsomchai/spj/slides/... · ภาษาจาวา – Exception & Assertion สมชาย ประสิทธิ์จูตระก

© S.Prasitjutrakul 2004 16/01/48 3

แบบเดม ๆ

int readFile() {errCode = 0;c = open the file;if (c == theFileIsOpen) {c = allocate memory;if (c == gotEnoughMemory) {c = read the file into memory;if (c != readSuccess) errCode = -2;

} else {errCode = -3;

}c = close the file;if (c != theFileClose && errCode == 0) errCode = -4;

} else {errCode = -1;

}return errCode;

}

int readFile() {errCode = 0;c = open the file;if (c == theFileIsOpen) {c = allocate memory;if (c == gotEnoughMemory) {c = read the file into memory;if (c != readSuccess) errCode = -2;

} else {errCode = -3;

}c = close the file;if (c != theFileClose && errCode == 0) errCode = -4;

} else {errCode = -1;

}return errCode;

}

Page 4: ภาษาจาวา – Exception & Assertionsomchai/spj/slides/... · ภาษาจาวา – Exception & Assertion สมชาย ประสิทธิ์จูตระก

© S.Prasitjutrakul 2004 16/01/48 4

แบบใหม อานงายกวา

readFile() {try {open the file;allocate that much memory;read the file into memory;close the file;

} catch (fileOpenFailed) {doSomething;

} catch (memoryAllocationFailed) {doSomething;

} catch (readFailed) {doSomething;

} catch (fileCloseFailed) {doSomething;

}}

readFile() {try {open the file;allocate that much memory;read the file into memory;close the file;

} catch (fileOpenFailed) {doSomething;

} catch (memoryAllocationFailed) {doSomething;

} catch (readFailed) {doSomething;

} catch (fileCloseFailed) {doSomething;

}}

Page 5: ภาษาจาวา – Exception & Assertionsomchai/spj/slides/... · ภาษาจาวา – Exception & Assertion สมชาย ประสิทธิ์จูตระก

© S.Prasitjutrakul 2004 16/01/48 5

method1 {method2();}method2 {method3();}method3 {readFile();}

method1 {method2();}method2 {method3();}method3 {readFile();}

method1 {err = method2();if (err)doErrorProcessing;

elseproceed();

}int method2 {err = method3();if (err)return err;

elseproceed();

}int method3 {err = readFile();if (err)return error;

elseproceed();

}

method1 {err = method2();if (err)doErrorProcessing;

elseproceed();

}int method2 {err = method3();if (err)return err;

elseproceed();

}int method3 {err = readFile();if (err)return error;

elseproceed();

}

method1 {try {method2(); proceed();

} catch (exception) {doErrorProcessing;

}}method2 throws exception {method3(); proceed();

}method3 throws exception {readFile(); proceed();

}

method1 {try {method2(); proceed();

} catch (exception) {doErrorProcessing;

}}method2 throws exception {method3(); proceed();

}method3 throws exception {readFile(); proceed();

}

Error Propagation

แบบเดม ๆแบบใหม

Page 6: ภาษาจาวา – Exception & Assertionsomchai/spj/slides/... · ภาษาจาวา – Exception & Assertion สมชาย ประสิทธิ์จูตระก

© S.Prasitjutrakul 2004 16/01/48 6

Errors และ Exceptions

• การทางานของโปรแกรมมโอกาสเกดความผดพลาด หรอพบสงผดปกต จาก– คาสงตางๆ ของจาวา

• หนวยความจาหมด,• หารจานวนเตมดวย 0• เปลยนประเภทขอมลไมได• อางอง index ของอาเรยนอกชวงทจองไว• ...

– เมทอดทเรยกใช• สภาวะของออปเจกตผดปกต• เปดแฟมไมสาเรจ• พารามเตอรมคาไมเปนไปตามทกาหนด• ...

การตรวจสอบและแจง exception เกดขนในเมทอด

JVM เปนผตรวจสอบและแจง error หรอ

exception

Page 7: ภาษาจาวา – Exception & Assertionsomchai/spj/slides/... · ภาษาจาวา – Exception & Assertion สมชาย ประสิทธิ์จูตระก

© S.Prasitjutrakul 2004 16/01/48 7

การแจงความผดพลาดและสงผดปกต

• ใชการโยน (throw) ออปเจกตทแทน error และ exception ทเกด

• ชอ class ของออปเจกตแทนประเภทของ error และ exception ทเกด

public class Test {

public static void main(String[] args) {

String inputString = args[0];

double inputValue = Double.parseDouble(inputString);

System.out.println("Sqrt(" + inputValue+") = " +

Math.sqrt(inputValue));

}

}

ArrayIndexOutOfBoundsException

NumberFormatException

Page 8: ภาษาจาวา – Exception & Assertionsomchai/spj/slides/... · ภาษาจาวา – Exception & Assertion สมชาย ประสิทธิ์จูตระก

© S.Prasitjutrakul 2004 16/01/48 8

Exceptions ทเกดขนจากระบบจาวา

• การทางานมโอกาสผดปกต (Exception)

// ArithmeticExceptionint a = 4, b = 0;int c = a / b;

// ArithmeticExceptionint a = 4, b = 0;int c = a / b;

// StackOverflowErrorvoid Jeng() {Jeng();

}

// StackOverflowErrorvoid Jeng() {Jeng();

}

// ArrayIndexOutOfBoundsExceptionint [] a = int[40];a[40] = 20;

// ArrayIndexOutOfBoundsExceptionint [] a = int[40];a[40] = 20;

// ArrayStoreExceptionObject [] a = new String[5];a[0] = new Rectangle();

// ArrayStoreExceptionObject [] a = new String[5];a[0] = new Rectangle();

// ClassCastExceptionObject a = new Rectangle();System.out.println((String) a);

// ClassCastExceptionObject a = new Rectangle();System.out.println((String) a);

// NegativeArraySizeExceptionint n = -100;Vector [] a = new Vector[n];

// NegativeArraySizeExceptionint n = -100;Vector [] a = new Vector[n];

// FileNotFoundExceptionBufferedReader in = new BufferedReader(

new FileReader("data.in"));String txt = in.readLine();

// FileNotFoundExceptionBufferedReader in = new BufferedReader(

new FileReader("data.in"));String txt = in.readLine();

Page 9: ภาษาจาวา – Exception & Assertionsomchai/spj/slides/... · ภาษาจาวา – Exception & Assertion สมชาย ประสิทธิ์จูตระก

© S.Prasitjutrakul 2004 16/01/48 9

เมอเขยนเมทอดทอาจแจงความผดปกต

• เมอพบความผดปกตภายในเมทอด และตองการแจงใหผเรยกทราบ– สรางออบเจกตของคลาสทแทนความผดปกตทเกดขน– throw ออบเจกตนนใหผเรยกรบทราบ– เขยนบอกไวทหวเมทอดดวยวา เมทอดนอาจ throws

/*** Find real roots of a quadratic equation of the form* a*x^2 + b*x + c.* @return a two double-element array containing the two roots* @throws IllegalArgumentException when there's an imaginary root*/

public double[] qRoot(double a, double b, double c)throws IllegalArgumentException {

double t = b * b - 4 * a * c;if (t < 0) throw new IllegalArgumentException("imaginary");...

}

/*** Find real roots of a quadratic equation of the form* a*x^2 + b*x + c.* @return a two double-element array containing the two roots* @throws IllegalArgumentException when there's an imaginary root*/

public double[] qRoot(double a, double b, double c)throws IllegalArgumentException {

double t = b * b - 4 * a * c;if (t < 0) throw new IllegalArgumentException("imaginary");...

}

Page 10: ภาษาจาวา – Exception & Assertionsomchai/spj/slides/... · ภาษาจาวา – Exception & Assertion สมชาย ประสิทธิ์จูตระก

© S.Prasitjutrakul 2004 16/01/48 10

Example : Account

class Account {protected long balance;public void withdraw(long amount) {balance -= amount;

}public void deposit(long amount) {balance += amount;

}public long getBalance() {return balance;

}}

class Account {protected long balance;public void withdraw(long amount) {balance -= amount;

}public void deposit(long amount) {balance += amount;

}public long getBalance() {return balance;

}}

ถาถอนเปนจานวนเงนทมากกวาในบญช จะทาอยางไร ?

ถาไมรวาจะจดการกบเหตการณเชนน กโยนในผเรยก withdraw ทราบ

Page 11: ภาษาจาวา – Exception & Assertionsomchai/spj/slides/... · ภาษาจาวา – Exception & Assertion สมชาย ประสิทธิ์จูตระก

© S.Prasitjutrakul 2004 16/01/48 11

Be Specific

class Account {protected long balance;public void withdraw(long amount)

throw IOException {if (balance < amount) throw new IOException();balance -= amount;

}...

}

class Account {protected long balance;public void withdraw(long amount)

throw IOException {if (balance < amount) throw new IOException();balance -= amount;

}...

} public void withdraw(long amount) throw Exception {if (balance < amount) throw new Exception();balance -= amount;

}

public void withdraw(long amount) throw Exception {if (balance < amount) throw new Exception();balance -= amount;

}

public void withdraw(long amount) throw InsufficientFundException {

if (balance < amount)throw new InsufficientFundException();

balance -= amount;}

public void withdraw(long amount) throw InsufficientFundException {

if (balance < amount)throw new InsufficientFundException();

balance -= amount;}

ไมสอความหมาย

ความหมายกวางไป

ชอสอความหมาย

Page 12: ภาษาจาวา – Exception & Assertionsomchai/spj/slides/... · ภาษาจาวา – Exception & Assertion สมชาย ประสิทธิ์จูตระก

© S.Prasitjutrakul 2004 16/01/48 12

เมอใชเมทอดทอาจแจงความผดปกต

• ขอจดการ โดยการใชคาสง try-catch– “ดก” สงผดปกต เพอจดการ– “ดก” สงผดปกต เพอเปลยนประเภทแลวโยนตอ

• ไมขอจดการกโยนตอ โดยการประกาศไวทหวเมทอดtry {

statementstatement

...statement

} catch( Exception1 varName ) {statement...statement

}

try {

statementstatement

...statement

} catch( Exception1 varName ) {statement...statement

}

ถาขอความสงใดโยนออบเจกตของคลาส Exception1 การทางานจะกระโดดไปทางานตอท catch block

ตวแปรนกคอตวอางองออบเจกตทถกโยนออกมาเนองจากเกดสงผดปกต

Page 13: ภาษาจาวา – Exception & Assertionsomchai/spj/slides/... · ภาษาจาวา – Exception & Assertion สมชาย ประสิทธิ์จูตระก

© S.Prasitjutrakul 2004 16/01/48 13

Example : Account

public static void main(String[] arg) {Account acc = new Account();acc.deposit(100);acc.withdraw(120);System.out.println(acc.getBalance());

}

public static void main(String[] arg) {Account acc = new Account();acc.deposit(100);acc.withdraw(120);System.out.println(acc.getBalance());

}compilation error : ใชเมทอดทอาจโยน exception กตอง catch หรอไมกโยนตอ

public static void main(String[] arg) {Account acc = new Account();try {acc.deposit(100);acc.withdraw(120);System.out.println(acc.getBalance());

} catch (InsufficientFundException e) {System.out.println("I won't let you withdraw");

}}

public static void main(String[] arg) {Account acc = new Account();try {acc.deposit(100);acc.withdraw(120);System.out.println(acc.getBalance());

} catch (InsufficientFundException e) {System.out.println("I won't let you withdraw");

}}

Page 14: ภาษาจาวา – Exception & Assertionsomchai/spj/slides/... · ภาษาจาวา – Exception & Assertion สมชาย ประสิทธิ์จูตระก

© S.Prasitjutrakul 2004 16/01/48 14

มไดหลาย catch blocks

try {

statement...

statement

} catch( Exception1 varName ) {statement...

statement} catch( Exception2 varName ) {statement...

statement} catch( Exception3 varName ) {statement...

statement}

try {

statement...

statement

} catch( Exception1 varName ) {statement...

statement} catch( Exception2 varName ) {statement...

statement} catch( Exception3 varName ) {statement...

statement}

การทางานจะกระโดดไปทางานตอท catch block ใด กขนกบวาออบเจกตทถกโยนมาตรงกบคลาสของ catch block ใด

Page 15: ภาษาจาวา – Exception & Assertionsomchai/spj/slides/... · ภาษาจาวา – Exception & Assertion สมชาย ประสิทธิ์จูตระก

© S.Prasitjutrakul 2004 16/01/48 15

ตวอยาง

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

String inputString = args[0];double inputValue = Double.parseDouble(inputString);System.out.println("Sqrt(" + inputValue+") = " +

Math.sqrt(inputValue));

} catch (IndexOutOfBoundsException e) {System.err.println("no number is specified");

} catch (NumberFormatException e) {System.err.println("the argument is not a number");

}

}} exception handling

normal processing

Page 16: ภาษาจาวา – Exception & Assertionsomchai/spj/slides/... · ภาษาจาวา – Exception & Assertion สมชาย ประสิทธิ์จูตระก

© S.Prasitjutrakul 2004 16/01/48 16

ถาไมจดการ exception กสามารถ “โยน” ตอ

void transfer(Account accFrom, long amount)throw InsufficientFundException {

try {accFrom.withdraw(amount);this.deposit(amount);

} catch (InsufficientFundException e) {throw e;

}}

void transfer(Account accFrom, long amount)throw InsufficientFundException {

try {accFrom.withdraw(amount);this.deposit(amount);

} catch (InsufficientFundException e) {throw e;

}}

void transfer(Account accFrom, long amount)throw InsufficientFundException {

accFrom.withdraw(amount);this.deposit(amount);

}

void transfer(Account accFrom, long amount)throw InsufficientFundException {

accFrom.withdraw(amount);this.deposit(amount);

}

Page 17: ภาษาจาวา – Exception & Assertionsomchai/spj/slides/... · ภาษาจาวา – Exception & Assertion สมชาย ประสิทธิ์จูตระก

© S.Prasitjutrakul 2004 16/01/48 17

สามารถเปลยนประเภท กอน “โยน” ตอ

void transfer(Account accFrom, long amount)throw TransferFailException {

try {accFrom.withdraw(amount);this.deposit(amount);

} catch (InsufficientFundException e) {

throw new TransferFailException();

}}

void transfer(Account accFrom, long amount)throw TransferFailException {

try {accFrom.withdraw(amount);this.deposit(amount);

} catch (InsufficientFundException e) {

throw new TransferFailException();

}}

Page 18: ภาษาจาวา – Exception & Assertionsomchai/spj/slides/... · ภาษาจาวา – Exception & Assertion สมชาย ประสิทธิ์จูตระก

© S.Prasitjutrakul 2004 16/01/48 18

Finally block

• เปน block ทมาทางานเสมอไมวาจะเกด exception หรอไมกตาม

public void method() throws Exception1, Exception2 {try {...

} finally {...

}}

public void method() throws Exception1, Exception2 {try {...

} finally {...

}} try {

...} catch( Exception1 varName ) {...

} catch( Exception2 varName ) {...

} finally {...

}

try {...

} catch( Exception1 varName ) {...

} catch( Exception2 varName ) {...

} finally {...

}

Page 19: ภาษาจาวา – Exception & Assertionsomchai/spj/slides/... · ภาษาจาวา – Exception & Assertion สมชาย ประสิทธิ์จูตระก

© S.Prasitjutrakul 2004 16/01/48 19

try-finally

public boolean searchFor(String file, String word)throws StreamException {

Stream input = null;try {

input = new Stream(file);while (!input.eof())if (input.next().equals(word)) return true;

return false;

} finally {if (input != null) input.close();

}}

public boolean searchFor(String file, String word)throws StreamException {

Stream input = null;try {

input = new Stream(file);while (!input.eof())if (input.next().equals(word)) return true;

return false;

} finally {if (input != null) input.close();

}}

Page 20: ภาษาจาวา – Exception & Assertionsomchai/spj/slides/... · ภาษาจาวา – Exception & Assertion สมชาย ประสิทธิ์จูตระก

© S.Prasitjutrakul 2004 16/01/48 20

คลาสอะไรทสรางออปเจกตแลวโยนได ?

• โยนไดเฉพาะออปเจกตท “เปน” Throwable

Throwable

Error

Exception

RuntimeException

OutofMemoryError

AWTError

IOException

FileNotFoundException

EOFException

InterruptedException

ArithmeticException

ClassCastException

.

.

.

.

.

.

.

.

.

.

.

.

ระบบจาวาเปนผโยน Error และลกหลาน โปรแกรมเมอรทวไป ไมควร

throw และไมควร catch

Page 21: ภาษาจาวา – Exception & Assertionsomchai/spj/slides/... · ภาษาจาวา – Exception & Assertion สมชาย ประสิทธิ์จูตระก

© S.Prasitjutrakul 2004 16/01/48 21

Checked & Unchecked Exceptions

• จาวาแบง exceptions เปน– Checked

• ถาในเมทอดมการโยนแบบ checked ตองประกาศทหวเมทอด• ถาเรยกใชเมทอดทโยนแบบ checked ตอง catch หรอโยนตอ

– Unchecked• ถาในเมทอดมการโยนแบบ unchecked ไมตองประกาศทหวเมทอด• ถาเรยกใชเมทอดทโยนแบบ unchecked ไมตอง catch หรอโยนตอ

• compiler จะจจกบ checked exceptions• RuntimeException และลกหลานเปน unchecked

จาวาเปนภาษาเดยวทใช checked exception อยางจรง ๆ จง ๆ

Error และลกหลานกถอวาเปนแบบ unchecked

Page 22: ภาษาจาวา – Exception & Assertionsomchai/spj/slides/... · ภาษาจาวา – Exception & Assertion สมชาย ประสิทธิ์จูตระก

© S.Prasitjutrakul 2004 16/01/48 22

Checked Exceptions

• มกใชกบสงผดปกตทมสาเหตมาจากภายนอกระบบ– หาแฟมไมพบ, ผใชกรอกขอมลผด, เครองแมขายตดตอไมได, เครองพมพไมพรอม, ...

• checked exception บบใหผใชเมทอดตอง catchหรอไมกตองโยนตอ

void readProductCode() {FileInputStream f = new FileInputStream("code.txt");...

}

void readProductCode() {FileInputStream f = new FileInputStream("code.txt");...

} void readProductCode() throws FileNotFoundException {FileInputStream f = new FileInputStream("code.txt");...

}

void readProductCode() throws FileNotFoundException {FileInputStream f = new FileInputStream("code.txt");...

}void readProductCode() {try {FileInputStream f = new FileInputStream("code.txt");...

} catch( FileNotFoundException e ) { ... }

void readProductCode() {try {FileInputStream f = new FileInputStream("code.txt");...

} catch( FileNotFoundException e ) { ... }

Page 23: ภาษาจาวา – Exception & Assertionsomchai/spj/slides/... · ภาษาจาวา – Exception & Assertion สมชาย ประสิทธิ์จูตระก

© S.Prasitjutrakul 2004 16/01/48 23

Unchecked Exceptions

• มกใชแสดงสงผดปกตทเกดจากการไมปฏบตตาม semantic contract เชน– IllegalArgumentException ใชในกรณท argument ทสงมาไมเปนไปตามทสญญากนไวใน spec.

• input หามตดลบ, input หามมเกน 4 หลก, ...– IllegalStateException ใชในกรณทมการเรยกเมทอดตอนทไมควรถกเรยก

• หามเรยก exit กอน enter, หามเรยก remove ตอน empty, ...– NullPointerException, ArithmeticException,

ArrayIndexOutOfBoundsException, ...• มกใชกบ public method• ถาผด contract ของ private method ควรใช assert• เมอเกด unchecked exception มกหมายถง bugs

Page 24: ภาษาจาวา – Exception & Assertionsomchai/spj/slides/... · ภาษาจาวา – Exception & Assertion สมชาย ประสิทธิ์จูตระก

© S.Prasitjutrakul 2004 16/01/48 24

Unchecked Exceptions

/*** Returns the element at the specified index in this list.** @param i index of element to return.* @return the element at the specified index in this list.* @throws IndexOutOfBoundsException if out of range*/public void get(int i) {if (i < 0 || i >= size)throw new IndexOutOfBoundsException("i = " + i);

...}

}

/*** Returns the element at the specified index in this list.** @param i index of element to return.* @return the element at the specified index in this list.* @throws IndexOutOfBoundsException if out of range*/public void get(int i) {if (i < 0 || i >= size)throw new IndexOutOfBoundsException("i = " + i);

...}

}List list = new ArrayList();...for (int i = 0; i <= list.size(); i++) {process(list.get(i));

}

List list = new ArrayList();...for (int i = 0; i <= list.size(); i++) {process(list.get(i));

}

compiler ไมฟองวาตอง catch IndexOutOfBoundsException

Page 25: ภาษาจาวา – Exception & Assertionsomchai/spj/slides/... · ภาษาจาวา – Exception & Assertion สมชาย ประสิทธิ์จูตระก

© S.Prasitjutrakul 2004 16/01/48 25

การสราง exception แบบใหม

• แบบ unchecked ก extends จาก RuntimeException• แบบ checked ก extends จาก Exception

public class NewUnchecked extends RuntimeException {public NewUnchecked () {super();

}public NewUnchecked(String s) {super(s);

}}

public class NewUnchecked extends RuntimeException {public NewUnchecked () {super();

}public NewUnchecked(String s) {super(s);

}} public class NewChecked extends Exception {

public NewChecked () {super();

}public NewChecked(String s) {super(s);

}}

public class NewChecked extends Exception {public NewChecked () {super();

}public NewChecked(String s) {super(s);

}}

Page 26: ภาษาจาวา – Exception & Assertionsomchai/spj/slides/... · ภาษาจาวา – Exception & Assertion สมชาย ประสิทธิ์จูตระก

© S.Prasitjutrakul 2004 16/01/48 26

Invoking Methods on Throwable Objects

• เมอ catch exception object แลว สามารถเรยกใชเมทอดของออปเจกตได (ใน Throwable) เชน– String getMessage( )คน message ทผสราง exception object สงให constructor

– void printStackTrace( )แสดง stack trace ของการเรยกเมทอดตางๆ ณ จดทเกด exception ออกทาง System.err

Page 27: ภาษาจาวา – Exception & Assertionsomchai/spj/slides/... · ภาษาจาวา – Exception & Assertion สมชาย ประสิทธิ์จูตระก

© S.Prasitjutrakul 2004 16/01/48 27

getMessage and printStackTrace

01: public class A {02: public static void main(String[] args) {03: try {04: a();05: } catch (IllegalStateException e) {06: System.out.println(e.getMessage());07: e.printStackTrace();08: }09: }10: public static void a() { b(); }11: public static void b() { c(); }12: public static void c() {13: throw new IllegalStateException("Just a test");14: } 15: }

01: public class A {02: public static void main(String[] args) {03: try {04: a();05: } catch (IllegalStateException e) {06: System.out.println(e.getMessage());07: e.printStackTrace();08: }09: }10: public static void a() { b(); }11: public static void b() { c(); }12: public static void c() {13: throw new IllegalStateException("Just a test");14: } 15: } Just a test

java.lang.IllegalStateException: Just a testat A.c(A.java:13)at A.b(A.java:11)at A.a(A.java:10)at A.main(A.java:4)

Page 28: ภาษาจาวา – Exception & Assertionsomchai/spj/slides/... · ภาษาจาวา – Exception & Assertion สมชาย ประสิทธิ์จูตระก

© S.Prasitjutrakul 2004 16/01/48 28

เรองจกจก : ลาดบของ catch clauses

• หนง try มหลาย catch blocks ได• ถาม exception ทมสายสมพนธกน ตอง catch ลกหลานกอนบรรพบรษ

Exception

Type2Type1

Type21

Type211

Type11

try {...

} catch (Type211 e) {...

} catch (Type21 e) {...

} catch (Type11 e) {...

} catch (Type2 e) {...

} catch (Type1 e) {...

} catch (Exception e) {...

}

try {...

} catch (Type211 e) {...

} catch (Type21 e) {...

} catch (Type11 e) {...

} catch (Type2 e) {...

} catch (Type1 e) {...

} catch (Exception e) {...

}

Page 29: ภาษาจาวา – Exception & Assertionsomchai/spj/slides/... · ภาษาจาวา – Exception & Assertion สมชาย ประสิทธิ์จูตระก

© S.Prasitjutrakul 2004 16/01/48 29

เรองจกจก : overriding

• เมทอดของ subclass ท overriding ของ superclass หามโยน checked exception ทไม “เปน” แบบเดยวกบท superclass โยน

Exception

Type2Type1

Type21

Type211

Type11

class A {void a() throws Type21 {...}

}

class A {void a() throws Type21 {...}

}class B extends A {void a() throws Type211 {...}

}

class B extends A {void a() throws Type211 {...}

}class C extends A {void a() throws Type21, Type211 {...}

}

class C extends A {void a() throws Type21, Type211 {...}

}

class D extends A {void a() throws Type1 {...}

}

class E extends A {void a() throws Type2 {...}

}

Page 30: ภาษาจาวา – Exception & Assertionsomchai/spj/slides/... · ภาษาจาวา – Exception & Assertion สมชาย ประสิทธิ์จูตระก

© S.Prasitjutrakul 2004 16/01/48 30

Exception Guidelines

• ใช checked exception กบกรณทนาจะจดการได• ใช run-time exception กบกรณทนาจะเปน bugs• อยาใช exception กบเหตการณปกตทตองเกด• ใช exception มาตรฐานทมอย

– IllegalArgumentException, IllegalStateException, ...

• throw early, catch late

int s = 0;try {int i = 0;while (true) s += a[i++];

} catch (ArrayIndexOutOfBoundsException e) {}

int s = 0;try {int i = 0;while (true) s += a[i++];

} catch (ArrayIndexOutOfBoundsException e) {}

Page 31: ภาษาจาวา – Exception & Assertionsomchai/spj/slides/... · ภาษาจาวา – Exception & Assertion สมชาย ประสิทธิ์จูตระก

© S.Prasitjutrakul 2004 16/01/48 31

Exception Guidelines

• ถาไมจดการ ใหโยนตอ อยา “กลน”

void a() {try {someProcessing();

} catch (IOException e) {handleException();

}}

void a() {try {someProcessing();

} catch (IOException e) {handleException();

}} class A {

void a() throws IOException {someProcessing();

}}

class A {void a() throws IOException {someProcessing();

}}

void a() {try {someProcessing();

} catch (IOException e) { }}

void a() {try {someProcessing();

} catch (IOException e) { }}

Page 32: ภาษาจาวา – Exception & Assertionsomchai/spj/slides/... · ภาษาจาวา – Exception & Assertion สมชาย ประสิทธิ์จูตระก

© S.Prasitjutrakul 2004 16/01/48 32

Bugs

• Fixing bugs is easy• Finding bugs is hard

public void withdraw(long amount) {if (amount < 0)throw new IllegalArgumentException(this + ": amount = " + amount);

...}

public void withdraw(long amount) {if (amount < 0)throw new IllegalArgumentException(this + ": amount = " + amount);

...}

เกดอะไรขน ?

เกดขนทไหน ?ทาไมถงเกด ?

ด stack trace

Page 33: ภาษาจาวา – Exception & Assertionsomchai/spj/slides/... · ภาษาจาวา – Exception & Assertion สมชาย ประสิทธิ์จูตระก

© S.Prasitjutrakul 2004 16/01/48 33

Assertion

private void heatReactor(int temp) {assert 200 < temp && temp < 1000 : "too hot " + temp;reactor.setHeat(temp);...

}

private void heatReactor(int temp) {assert 200 < temp && temp < 1000 : "too hot " + temp;reactor.setHeat(temp);...

}

private void heatReactor(int temp) { reactor.setHeat(temp);...

}

private void heatReactor(int temp) { reactor.setHeat(temp);...

}

มนใจมาก private method เขยนเอง รบรองวา temp ทสงมาใหไมรอนเกนแนๆ

กนไวดกวาแก ตรวจสอบใหแนใจ ถาอยนอกชวงกถอวาเปน bug

Page 34: ภาษาจาวา – Exception & Assertionsomchai/spj/slides/... · ภาษาจาวา – Exception & Assertion สมชาย ประสิทธิ์จูตระก

© S.Prasitjutrakul 2004 16/01/48 34

Assertion

• คาสงทตามดวย boolean expression ทโปรแกรมเมอรมนใจวาตองเปนจรง

• ถาเกดเทจขณะทางาน จะเกด AssertionError• disable การตรวจสอบได• โดยทวไป enable ตอนพฒนาและทดสอบ เมอมนใจวาปลอดภย ก disable ตอนใชจรง

javac –source 1.4 Test.java

java –ea Test

ใชไดเฉพาะรน 1.4 เปนตนไป

Page 35: ภาษาจาวา – Exception & Assertionsomchai/spj/slides/... · ภาษาจาวา – Exception & Assertion สมชาย ประสิทธิ์จูตระก

© S.Prasitjutrakul 2004 16/01/48 35

Assertion : Syntax

assert booleanExpression;

assert booleanExpression : expression;

String ทแทนขอความแสดงรายละเอยดของความผดพลาด

private void heatReactor(int temp) {assert 200 < temp && temp < 1000 : "too hot " + temp;reactor.setHeat(temp);...

}

private void heatReactor(int temp) {assert 200 < temp && temp < 1000 : "too hot " + temp;reactor.setHeat(temp);...

}

Page 36: ภาษาจาวา – Exception & Assertionsomchai/spj/slides/... · ภาษาจาวา – Exception & Assertion สมชาย ประสิทธิ์จูตระก

© S.Prasitjutrakul 2004 16/01/48 36

Assertion : มไปทาไม ?

• เขยนใหคนเขาใจและใหเครองตรวจสอบ ขอสมมตของโปรแกรมเมอร

• ชวยในการหา bug• เพมความมนใจวาซอฟตแวรทใชงานไมม bug• ดกวา exception ตรงท disable การตรวจสอบไดตอน run-time โดยไมเสยประสทธการทางานเลย

Page 37: ภาษาจาวา – Exception & Assertionsomchai/spj/slides/... · ภาษาจาวา – Exception & Assertion สมชาย ประสิทธิ์จูตระก

© S.Prasitjutrakul 2004 16/01/48 37

Assertion : จะเขยนไวทใด

• precondition ของ non-public methods• postcondition ของ methods ทวไป• แทน comment ในโปรแกรมดวย assertion• เพม assert ใน switch ทไมม default• เพม assert ใน control flow ทไมมทางไปถง

Page 38: ภาษาจาวา – Exception & Assertionsomchai/spj/slides/... · ภาษาจาวา – Exception & Assertion สมชาย ประสิทธิ์จูตระก

© S.Prasitjutrakul 2004 16/01/48 38

Assertion : Preconditions

private void heatReactor(int temp) {assert 200 < temp && temp < 1000 : "too hot " + temp;reactor.setHeat(temp);...

}

private void heatReactor(int temp) {assert 200 < temp && temp < 1000 : "too hot " + temp;reactor.setHeat(temp);...

}

private void heatReactor(int temp) { reactor.setHeat(temp);...

}

private void heatReactor(int temp) { reactor.setHeat(temp);...

}

มนใจมาก private method เขยนเอง รบรองวา temp ทสงมาใหไมรอนเกนแนๆ

กนไวดกวาแก ตรวจสอบใหแนใจ ถาอยนอกชวงกถอวาเปน bug

Page 39: ภาษาจาวา – Exception & Assertionsomchai/spj/slides/... · ภาษาจาวา – Exception & Assertion สมชาย ประสิทธิ์จูตระก

© S.Prasitjutrakul 2004 16/01/48 39

Assertion : Postconditions

public void add(Object v) {Entry t = root;while (t != null) {...

}assert isBalanced() : "no longer balanced";

}

public void add(Object v) {Entry t = root;while (t != null) {...

}assert isBalanced() : "no longer balanced";

}

public void add(Object v) {Entry t = root;while (t != null) {...

}}

public void add(Object v) {Entry t = root;while (t != null) {...

}}

มนใจมาก เราเขยน put เอง ทดสอบหลายครงแลว ถกแน ๆ

กนไวดกวาแก ตรวจสอบกอนเสรจ วายงคงเปน balanced tree

Page 40: ภาษาจาวา – Exception & Assertionsomchai/spj/slides/... · ภาษาจาวา – Exception & Assertion สมชาย ประสิทธิ์จูตระก

© S.Prasitjutrakul 2004 16/01/48 40

Assertion : แทน comment

void goo() {int x, y;...// here, x is definitely non-zeroint m = y / x;...

}

void goo() {int x, y;...// here, x is definitely non-zeroint m = y / x;...

}void goo() {int x, y;...assert x != 0;int m = y / x;...

}

void goo() {int x, y;...assert x != 0;int m = y / x;...

}

มนใจมาก เขยนใหคนอานกพอ

มนใจมาก เขยนใหคนอานและใหเครองตรวจสอบ

Page 41: ภาษาจาวา – Exception & Assertionsomchai/spj/slides/... · ภาษาจาวา – Exception & Assertion สมชาย ประสิทธิ์จูตระก

© S.Prasitjutrakul 2004 16/01/48 41

Assertion : ตรงจดทมนใจวาไปไมถง

Icecream get(int flavor) {swith(flavor) {case VANILLA :...

case COCONUT :...

case LEMON :...

}}

Icecream get(int flavor) {swith(flavor) {case VANILLA :...

case COCONUT :...

case LEMON :...

}}

Icecream get(int flavor) {swith(flavor) {case VANILLA :...

case COCONUT :...

case LEMON :...

default :assert false : flavor;

}}

Icecream get(int flavor) {swith(flavor) {case VANILLA :...

case COCONUT :...

case LEMON :...

default :assert false : flavor;

}}

Page 42: ภาษาจาวา – Exception & Assertionsomchai/spj/slides/... · ภาษาจาวา – Exception & Assertion สมชาย ประสิทธิ์จูตระก

© S.Prasitjutrakul 2004 16/01/48 42

Assertion : ตรงจดทมนใจวาไปไมถง

void goo() {for (...) {...if (...) return;...

}// never reach here

}

void goo() {for (...) {...if (...) return;...

}// never reach here

} void goo() {for (...) {...if (...) return;...

}assert false;

}

void goo() {for (...) {...if (...) return;...

}assert false;

}

Page 43: ภาษาจาวา – Exception & Assertionsomchai/spj/slides/... · ภาษาจาวา – Exception & Assertion สมชาย ประสิทธิ์จูตระก

© S.Prasitjutrakul 2004 16/01/48 43

ขอแนะนา

• expression ของ assert ตองไมม side effect• เพม assert ขณะกาลงเขยน ไมใชเพมหลงเขยนเสรจ• โปรย assert ใหทว ๆ• ไมตองหวงเรองเวลาการทางาน เพราะ disable ได• Exception ใชกบสงผดปกตทคาดวามสทธเกดถาเกดแลวมวธจดการ

• Assertion ใชกบสงทตองไมเกด ถาเกดแสดงวาผด• Exception handling เพม robustness• Assertion เพม reliability