Chương 7 cung cấp cho người học những kiến thức về xử lý ngoại lệ (Exception) trong java. Nội dung chính trong chương này gồm có: Xử lý lỗi và 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ệ. Mời các bạn cùng tham khảo.
CHƯƠNG XỬ LÝ NGOẠI LỆ (EXCEPTION) NỘI DUNG TRÌNH BÀY • • • • • • • 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; 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 10 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 21 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ệ 22 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(); } 23 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 24 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); } } 25 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ệ 26 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()); } } } 27 LAN TRUYỀN NGOẠI LỆ • Tình – 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ệ 28 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 29 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) 30 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ệ 31 BÀI TẬP Viết chương trình cho phép tính giá trị biểu thức: 5x - y A= 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 32 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 33 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 34 HẾT CHƯƠNG ... • • • 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... 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ử. .. • Java hỗ trợ cách thức để xử lý ngoại lệ (exception handling) tuỳ theo nhu cầu chương trình 10 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