Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 33 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
33
Dung lượng
433,5 KB
Nội dung
LECTURE XỬ LÝ NGOẠI LỆ (EXCEPTION) Xử lý lỗi ngoại lệ Khối try/catch/finally Các lớp ngoại lệ Xây dựng lớp ngoại lệ Lan truyền ngoại lệ Tung lại ngoại lệ Bài tập XỬ LÝ LỖI VÀ NGOẠI LỆ • Trong số ngôn ngữ C, việc xử lý lỗi thường cài đặt bước thực chương trình Các hàm trả cấu trúc lỗi gặp lỗi • Ví dụ: Tìm kiếm phần tử danh sách ErrorStruct error = new ErrorStruct(); TableEntry entry = lookup(“Marianna”, employee, error); if (entry == null) { return error; } XỬ LÝ LỖI VÀ NGOẠI LỆ Mã lệnh mã xử lý lỗi nằm xen kẽ khiến lập trình viên khó theo dõi thuật tốn chương trình Khi lỗi xảy hàm A, tất lời gọi hàm lồng đến A phải xử lý lỗi mà A trả XỬ LÝ LỖI VÀ NGOẠI LỆ • Trong Java, việc xử lý lỗi cài đặt nhánh độc lập với nhánh chương trình • Lỗi coi trường hợp ngoại lệ (exceptional conditions) Chúng bắt/ném (catch and throw) có lỗi xảy => Một trường hợp lỗi xử lý nơi cần xử lý => Mã chương trình sáng sủa, với thiết kế thuật tốn VÍ DỤ import java.awt.Point; public class MyArray { public static void main(String[ ] args) { System.out.println("Goi phuong thuc methodeX()"); methodeX(); System.out.println("Chuong trinh ket thuc binh thuong"); } public static void methodeX() { Point[ ] pts = new Point[10]; for(int i = 0; i < pts.length; i++) { pts[i].x = i; // chua tao object pts[i].y = i+1; } } } KẾT QUẢ THỰC THI VÍ DỤ Goi phuong thuc methodeX() Exception in thread "main" java.lang.NullPointerException at MyArray.methodeX(MyArray.java:14) at MyArray.main(MyArray.java:7) Giải thích: Hệ thống tung exception thuộc lớp NullPointerException gặp lỗi Sau chương trình kết thúc VÍ DỤ public class MyDivision { public static void main(String[ ] args) { System.out.println("Goi phuong thuc A()"); A(); System.out.println("Chuong trinh ket thuc binh thuong"); } public static void A() { B(); } public static void B() { C(); } public static void C() { float a = 2/0; } } KẾT QUẢ THỰC THI VÍ DỤ Goi phuong thuc A() Exception in thread "main" java.lang.ArithmeticException: / by zero at at at at MyDivision.C(MyDivision.java:14) MyDivision.B(MyDivision.java:11) MyDivision.A(MyDivision.java:8) MyDivision.main(MyDivision.java:4) Giải thích: Phương thức A() gọi B(), B() gọi C(), C() gây lỗi chia cho hệ thống “ném” exception thuộc lớp ArithmeticException Sau chương trình kết thúc NGOẠI LỆ • Khi phương thức gặp lỗi đó, ví dụ chia khơng, vượt kích thước mảng, mở file chưa tồn tại… ngoại lệ ném Chương trình dừng lại lập tức, tồn phần mã phía sau khơng thực thi • Java hỗ trợ cách thức để xử lý ngoại lệ (exception handling) tuỳ theo nhu cầu chương trình XỬ LÝ NGOẠI LỆ • Khối try/catch – Đặt đoạn mã có khả xảy ngoại lệ khối try – Đặt đoạn mã xử lý ngoại lệ khối catch – Khi xảy ngoại lệ khối try, câu lệnh khối catch thực tuỳ vào kiểu ngoại lệ – Sau thực xong khối catch, điều khiển trả lại cho chương trình 10 MỘT SỐ LỚP NGOẠI LỆ • RuntimeException: Chỉ ngoại lệ xảy JVM thực thi chương trình – NullPointException: trỏ null – OutOfMemoryException: hết nhớ – ArithmeticException: lỗi tốn học, lỗi chia khơng… – ClassCastException: lỗi ép kiểu – ArrayIndexOutOfBoundsException: vượt số mảng – 19 HAI LOẠI NGOẠI LỆ • Ngoại lệ unchecked – Là ngoại lệ không bắt buộc phải kiểm tra – Gồm RuntimeException, Error lớp chúng • Ngoại lệ checked – Là ngoại lệ bắt buộc phải kiểm tra – Gồm ngoại lệ lại 20 CHÚ Ý VỚI NGOẠI LỆ CHECKED • Giả sử method1 gọi method2 method2 phương thức có khả ném ngoại lệ kiểu checked, lúc đó: – method2 phải nằm khối try/catch – phải khai báo method1 có khả ném (throws) ngoại lệ 21 VÍ DỤ (NGOẠI LỆ IOException) • Cách 1: try/catch public static void main(String[] args) { try { String s = buff.readLine(); } catch (IOException e) { } } • Cách 2: Khai báo throws public static void main(String[ ] args) throws IOException { String s = buff.readLine(); } 22 Bài tập • Bài 1: Cài đặt xử lý ngoại lệ cho chương trình tính thương số giao diện GUI • Bài 2: Cài đặt xử lý lỗi cách dùng ngoại lệ cho ví dụ phần đầu 23 NGOẠI LỆ DO NGƯỜI DÙNG TẠO • Định nghĩa lớp ngoại lệ // file MyException.java public class MyException extends Exception { public MyException(String msg) { super(msg); } } 24 NGOẠI LỆ DO NGƯỜI DÙNG TẠO • Sử dụng ngoại lệ Khai báo khả tung ngoại lệ // file ExampleException.java public class ExampleException { public void copy(String fileName1, String fileName2) throws MyException { if (fileName1.equals(fileName2)) throw new MyException("File trung ten"); // tung ngoại lệ System.out.println("Copy completed"); } Tung ngoại lệ 25 NGOẠI LỆ DO NGƯỜI DÙNG TẠO • Sử dụng ngoại lệ public static void main(String[] args) { ExampleException obj = new ExampleException(); try { String a = args[0]; String b = args[1]; obj.copy(a,b); } catch (MyException e) { System.out.println(e.getMessage()); } } } 26 LAN TRUYỀN NGOẠI LỆ • Tình huống: – Giả sử main() gọi phương thức A(), A() gọi B(), B() gọi C() Khi ngăn xếp phương thức tạo – Giả sử C() xảy ngoại lệ 27 LAN TRUYỀN NGOẠI LỆ C() C() tung ngoại lệ B() B() A() A() main() main() Nếu C() gặp lỗi tung ngoại lệ C() lại không xử lý ngoại lệ này, cịn nơi xử lý nơi mà C() gọi, phương thức B() Nếu B() khơng xử lý phải xử lý ngoại lệ A()…Quá trình gọi lan truyền ngoại lệ Nếu đến main() không xử lý ngoại lệ tung từ C() chương trình phải dừng lại 28 NÉM LẠI NGOẠI LỆ • Trong khối catch, ta khơng xử lý trực tiếp ngoại lệ mà lại ném lại ngoại lệ cho nơi khác xử lý catch (IOException e) { throw e; } • Chú ý: Trong trường hợp trên, phương thức chứa catch phải bắt ngoại lệ khai báo throws cho ngoại lệ (nếu loại checked) 29 CHÚ Ý KHI SỬ DỤNG NGOẠI LỆ • Khơng nên sử dụng ngoại lệ thay cho luồng điều khiển chương trình – Ví dụ: Kiểm tra delta chương trình giải phương trình bậc • Nên thiết kế sử dụng ngoại lệ cách thống cho toàn dự án • Một số xử lý lỗi ngoại lệ phổ biến là: hết nhớ, vượt số mảng, trỏ null, chia cho 0, đối số không hợp lệ 30 BÀI TẬP Viết chương trình cho phép tính giá trị biểu thức: A= 5x - y 2x + 7y Yêu cầu xử lý ngoại lệ xảy Viết chương trình cho phép tạo mảng chiều cỡ mxn với m,n nhập từ bàn phím Cài đặt xử lý ngoại lệ cần thiết 31 BÀI TẬP Xây dựng lớp ngoại lệ DateException cho lỗi ngày tháng Viết chương trình cho phép người dùng nhập vào ngày, tháng năm, thông tin không hợp lệ tung ngoại lệ DateException, sau thơng báo cho người nhập biết cho phép người dùng nhập lại 32 BÀI TẬP 5 Tìm hiểu lại lớp Candidate học (dữ liệu gồm mã thí sinh, tên điểm thi mơn) Điều xảy tạo đối tượng thuộc lớp Candidate với liệu đưa vào không hợp lệ ? Cài đặt lớp CandidateException để bắt lỗi Yêu cầu có lỗi cho biết tên mã thí sinh bị lỗi 33 ... không xử lý phải xử lý ngoại lệ A()…Quá trình gọi lan truyền ngoại lệ Nếu đến main() không xử lý ngoại lệ tung từ C() chương trình phải dừng lại 28 NÉM LẠI NGOẠI LỆ • Trong khối catch, ta không xử. .. cách thức để xử lý ngoại lệ (exception handling) tuỳ theo nhu cầu chương trình XỬ LÝ NGOẠI LỆ • Khối try/catch – Đặt đoạn mã có khả xảy ngoại lệ khối try – Đặt đoạn mã xử lý ngoại lệ khối catch... phương thức gây ngoại lệ } finally { cleanup(); } 14 TÓM TẮT VỀ XỬ LÝ NGOẠI LỆ • Các ngoại lệ xảy gặp lỗi • Có thể bắt xử lý ngoại lệ cách sử dụng khối try/catch Nếu khơng chương trình kết thúc