Exception
Transcript of 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
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)
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);
}}
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
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);}
}
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
Ư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
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
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}
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ệ
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 }
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");
}}
}
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ệ
}}
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
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
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
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]);
}}
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()
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());
}}
}
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á");
}}
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ụ
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ệ...
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
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.