Download - Exception

Transcript
Page 1: Exception
Page 2: Exception

Khái niệm về Exception

Thông thường được các IDE hỗ trợ xử lý

Syntax error Logical error

Syntax error (Lỗi cú pháp) Logical error (Lỗi logic) Run-time error (Lỗi thực thi)

Run-time error

Page 3: Exception

Run-time Error

Chia cho 0 (Divide by zero errors)Chia cho 0 (Divide by zero errors)

Truy cập đến các phần tử ngoài mảng (Accessing the elements of an array

beyond its range)

Dữ liệu nhập vào không hợp lệ (Invalid Input)Dữ liệu nhập vào không hợp lệ (Invalid Input)

Truy xuất một tệp tin không tồn tại (Opening a non-existent file)

Lỗi bộ nhớ(Heap memory exhausted)

Lỗi vật lý của đĩa cứng(Hardisk crash)Lỗi vật lý của đĩa cứng(Hardisk crash)

Page 4: Exception

Ví dụpublic class Bai01 {

public static void main(String[] args) {

division(100,4); // Line 1division(100,0); // Line 2System.out.println("Exit main().");

}

public static void division(int totalSum, int totalNumber) {System.out.println("Computing Division.");int average = totalSum/totalNumber;System.out.println("Average : "+ average);

}}

Page 5: Exception

Cách xử lý lỗi truyền thống

Cài đặt đoạn mã xử lý ở nơi phát sinh ra lỗi

Truyền trạng thái lên mức trên

Các lập trình viên quên không xử lý lý lỗi

• Làm cho chương trình trở nên khó hiểu

• Không phải lúc nào cũng đầy đủ thông tin để xử lý

• Không nhất thiết phải xử lý

• Thông qua tham số, giá trị trả lại hoặc biến tổng thể

• Dễ nhầm

• Còn nhiều thiếu sót

• Bản chất người lập trình

• Thiếu kinh nghiệm, cố tình bỏ qua

Page 6: Exception

public class Bai01 {

public static void main(String[] args) {division(100,4);// Line 1division(100,0); // Line 2

System.out.println("Exit main().");}

public static void division(int totalSum, int totalNumber) {int average=0;System.out.println("Computing Division.");if (totalNumber !=0)

average = totalSum/totalNumber;else average=0;

System.out.println("Average : "+ average);}

}

Page 7: Exception

Exception

Là những đối tượng đặc biệt được viết sẵn trong gói java.lang

Tự động phát sinh trong lúc thực thi chương trình gặp lỗi.

Mang thông tin những lỗi đã xảy ra

Có mục đích dò tìm và đưa ra các giải pháp thích hợp.

Các loại Exception

Checked Exception

Unchecked Exception

Error

Page 8: Exception

Ưu điểm của ném bắt ngoại lệ

Dễ sử dụng

Tách xử lý ngoại lệ khỏi thuật toán

Không bỏ sót lỗi

Làm chương trình dễ đọc và an toàn

• Dễ dàng xử lý ngoại lệ

• Ném nhiều ngoại lệ khác nhau

• Tách mã xử lý

• Sử dụng cú pháp khác

Page 9: Exception

Phả hệ ngoại lệ trong Java

ThrowableThrowable

ErrorError

Virtual Machine

Error

Virtual Machine

Error

Out of MemoryOut of

MemoryStack

OverflowStack

Overflow

…… AWT ErrorAWT Error

ExceptionException

Runtime ExceptionRuntime

Exception

Arithmetic ExceptionArithmetic Exception …… NullPointer

ExceptionNullPointer Exception

IO Exception

IO Exception

EOF Exception

EOF Exception

FileNotFound Exception

FileNotFound Exception

Page 10: Exception

Xử lý ngoại lệ

Khối try/catch

Đặt đoạn mã có khả năng xảy ra ngoại lệ trong khối try

Đặt đoạn mã xử lý ngoại lệ trong khối catch

Khi xảy ra ngoại lệ trong khối try, các lệnh trong khối catch được thực thi.

Khi thực hiện xong khối catch, điều khiển sẽ được trả lại cho chương trình.

Cú pháp

try {// đoạn mã có khả năng gây ra ngoại lệ

}catch(ExceptionType e1) {

// Xử lý ngoại lệ 1}catch(ExceptionType eN) {

// Xử lý ngoại lệ thứ n}

Page 11: Exception

public class Bai02 {

public static void main(String[] args) {division(100,4); // Line 1division(100,0); // Line 2System.out.println("Exit main().");

}

public static void division(int totalSum, int totalNumber) {int average=0;System.out.println("Computing Division.");try{

average = totalSum/totalNumber;}catch (Exception e){

System.out.println("Err: "+e);}System.out.println("Average : "+ average);

}}

Ví dụ xử lý ngoại lệ

Page 12: Exception

Khối finally Khi một ngoại lệ xảy ra, chương trình dừng lại, một số

công việc “dọn dẹp” có thể sẽ không được thực hiện

Khối finally đảm bảo rằng các câu lệnh trong đó luôn được thực hiện, kể cả khi ngoại lệ xảy ra.

Cú pháp

try {// đoạn mã có khả năng gây ra ngoại lệ

}catch(ExceptionType e1) {

// Xử lý ngoại lệ 1}catch(ExceptionType eN) {

// Xử lý ngoại lệ thứ n}finally{

//Nhóm lệnh luôn được thực hiện }

Page 13: Exception

Ví dụ finallyimport java.util.*;public class Bai03{public static void main(String[] args) {

Scanner nhap = new Scanner(System.in);try {

System.out.println("Cô gái trốn khỏi nhà!");System.out.println("Nhập vào một số bất kì để tìm kiếm: ");int a =nhap.nextInt();System.out.println("Vệ sĩ đã tìm thấy và đưa cô ấy về!");

} catch (Exception e) {System.out.println("Vệ sĩ: Chúng tôi không tìm thấy!");

}finally{System.out.println("Cô ấy về rồi! Khỏi kiếm");

}}

}

Page 14: Exception

Ném ngoại lệ

Từ khóa throws

Không nhất thiếtphải xử lý ngoại lệtrong phương thức

• Không đủ thông tin để xử lý

• Không đủ thẩm quyền

Ví dụ

public class Test{

public static void main(String[] agrs) throws IOException{

BufferedReader in = new BufferedReader(new InputStreamReader(System.in));String srt = in.readLine(); // Dòng phát sinh ngoại lệ

}}

Page 15: Exception

Danh sách các ngoại lệ trong Java

Ngoại lệ Giải thích

Exception Lớp nền của run-time

NullPointerException Một đối tượng không tồn tại

ClassNotFoundException Không tìm thấy Class

FileNotFoundException Không tìm thấy file

SecurityException Exception liên quan đến bảo mật

ArrayIndexOutOfBoundsException Vượt quá chỉ mục của mảng

IllegalAccessException Truy cập không hợp lệ

IllegalArgumentException Đối số hàm

ArithmeticException Lỗi thực thi một phép toán

NumberFormatException Định dạng số không đúng

IOException Lỗi nhập xuất

EOFException Kết thúc một tập tin

NoSuchMethodException Sai tên phương thức

InterruptedException Ngắt luồng đang được thực thi

Page 16: Exception

Checked/ Unchecked Exception

Java phân biệt 2 loại ngoại lệ

Uncheck Exception(Ngoại lệ không cần kiểm tra)

Check Exception(Ngoại lệ không cần kiểm tra)

• RuntimeException

• Error

• Và các lớp con của chúng

• Gồm các ngoại lệ còn lại

Page 17: Exception
Page 18: Exception

Lan truyền ngoại lệ

main()

Phương thức 1

Phương thức 2

Phương thức 3

Phương thức 2

Phương thức 1

main()

Phương thức 3 tung ngoại lệ

Ngoại lệ lan truyền

Page 19: Exception

Ví dụ

public class Bai04{

public static void main(String[] args){methodA(null);

}

static void methodA(int[] a){methodB(a);

}

static void methodB(int[] b){System.out.println(b[0]);

}}

Page 20: Exception

Phương thức của lớp Exception

Các phương thức dưới đây đều kế thừa từ Throwable

• Exception() Khởi tạo một Exception mặc định, null

• Exception(String msg) Khởi tạo một Exception câu thông báo msg

• String getMessage() Lấy câu thông báo của Exception

• void printStackTrace() In ra stack lan truyền của Exception

• StackTraceElement[] Mỗi StackTraceElement là một đối tượng

chứa thôngtin về Exception

• getStackTrace()

Page 21: Exception

Cách dò một ngoại lệ

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

try {System.out.println("4 chia 5: "+4/0);

} catch (Exception e) {System.out.println("Lỗi: "+e);

System.out.println(e.getMessage());System.out.println(e.getClass());

}}

}

Page 22: Exception

Ngoại lệ do người dùng định nghĩa

Ngoài việc dùng các lớp đối tượng ngoại lệ có sẵn của Java, ta có

thể tự tạo cácexception cho phù hợp với chương trình của mình

Để tạo một lớp ngoại lệ, kế thừa từ Throwable( Exception)

Cài đặt các thông báo phù hợp.

public class MyNumberFormatException extends NumberFormatException {MyNumberFormatException(String s){System.out.println(s);System.out.println("Không thể convert chữ qua số nhá");

}}

Page 23: Exception

import java.io.*;public class Bai03{

public static void main(String[] agrs) {

BufferedReader in = new BufferedReader (new InputStreamReader(System.in));

try {

String srt = in.readLine();char c = srt.charAt(0);boolean b = Character.isLetter(c);if (b==true) throw new MyNumberFormatException("Ngoại lệ của tui");int i = Integer.parseInt(srt);

} catch (IOException e) {

} catch (MyNumberFormatException e){

}}

}

Ví dụ

Page 24: Exception

Chú ý khi sử dụng ngoại lệ

Không nên sử dụng ngoại lệ thay cho các luồng điều khiển trong chương trình.

Ví dụ: Kiểm tra delta trong chương trình giải phương trình bậc 2.

Nên thiết kế và sử dụng ngoại lệ một cách thống nhất cho toàn bộ dự án.

Một số xử lý lỗi bằng ngoại lệ phổ biến là: hết bộ nhớ, vượt quá chỉ số mảng, con trỏ null, chia cho 0, đối số không hợp lệ...

Page 25: Exception

Bài tập

1. Viết chương trình cho phép tính giá trị của biểuthức:

A =

Yêu cầu xử lý các ngoại lệ có thể xảy ra.

2. Viết chương trình cho phép tạo một mảng 2 chiềucỡ mxn với m,n nhập từ bàn phím. Cài đặt các xửlý ngoại lệ cần thiết.

5x - y

2x + 7y

Page 26: Exception

Bài tập

3. Xây dựng lớp ngoại lệ DateException cho các lỗivề ngày tháng.

4. Viết chương trình cho phép người dùng nhập vàongày, tháng năm, nếu thông tin này không hợp lệsẽ tung ra một ngoại lệ DateException, sau đóthông báo cho người nhập biết và cho phép ngườidùng nhập lại.