Sau khi học xong Bài giảng Lập trình hướng đối tượng Chương 6 Xử lý ngoại lệ sinh viên hiểu thêm về khái niệm về xử lý ngoại lệ (exception handling), ném và bắt ngoại lệ, khai báo ngoại lệ, ném lại ngoại lệ, định nghĩa ngoại lệ mới. Xử lý ngoại lệ trong constructor.
Xử lý ngoại lệ Nội dung Khái niệm xử lý ngoại lệ (exception handling) Ném bắt ngoại lệ Khai báo ngoại lệ Ném lại ngoại lệ Định nghĩa ngoại lệ Xử lý ngoại lệ constructor Xử lý ngoại lệ Tài liệu tham khảo Thinking in Java, chapter Java how to program, chapter 15 Xử lý ngoại lệ Lỗi ngoại lệ Mọi đoạn chương trình tiềm ẩn khả sinh lỗi lỗi chủ quan: lập trình sai lỗi khách quan: liệu, trạng thái hệ thống Ngoại lệ: trường hợp hoạt động khơng bình thường Xử lý ngoại lệ làm để tiếp tục (tái) thực Xử lý ngoại lệ Cách xử lý lỗi truyền thống Cài đặt mã xử lý nơi phát sinh lỗi Truyền trạng thái lên mức thông qua tham số, giá trị trả lại biến tổng thể (flag) dễ nhầm cịn khó hiểu Khó kiểm sốt hết trường hợp làm cho chương trình trở nên khó hiểu khơng phải lúc đầy đủ thông tin để xử lý không thiết phải xử lý lỗi số học, lỗi nhớ,… Lập trình viên thường quên không xử lý lỗi chất người thiếu kinh nghiệm, cố tình bỏ qua Xử lý ngoại lệ Ví dụ (C++) int devide(int num, int denom, int& error) { if (0 != denom) { error = 0; return num/denom; } else { error = 1; return 0; } } Xử lý ngoại lệ Xử lý ngoại lệ (Exception handling) Java Dựa chế ném bắt ngoại lệ ném ngoại lệ: dừng chương trình chuyển điều khiển lên mức (nơi bắt ngoại lệ) bắt ngoại lệ: xử lý với ngoại lệ Ngoại lệ: đối tượng mang thông tin lỗi xảy ngoại lệ ném tự động ngoại lệ ném tường minh Xử lý ngoại lệ Phả hệ ngoại lệ Java Xử lý ngoại lệ Ưu điểm ném bắt ngoại lệ Dễ sử dụng Dễ dàng chuyển điều khiển đến nơi có khả xử lý ngoại lệ ném nhiều loại ngoại lệ Tách xử lý ngoại lệ khỏi thuật toán tách mã xử lý sử dụng cú pháp khác Khơng bỏ sót ngoại lệ (ném tự động) Làm chương trình dễ đọc hơn, an toàn Xử lý ngoại lệ Ưu điểm ném bắt ngoại lệ readFile { open the file; determine its size; allocate that much memory; read the file into memory; close the file; } Xử lý ngoại lệ 10 Ném lại ngoại lệ Sau bắt ngoại lệ, thấy cần thiết ném lại ngoại lệ vừa bắt chương trình mức tiếp tục xử lý try { } catch (Exception e) { System.out.println(e.getMessage()); throw e; } Xử lý ngoại lệ 25 Lần vết ngoại lệ StackTrace Có thể sử dụng phương thức printStackTrace() để lần vết vị trí phát sinh ngoại lệ debug chương trình Xử lý ngoại lệ 26 public class Test4 { void methodA() throws Exception { methodB(); throw new Exception(); } void methodB() throws Exception { methodC(); throw new Exception(); } void methodC() throws Exception { throw new Exception(); } public static void main(String[] args) { Test4 t = new Test4(); try { t.methodA(); } catch(Exception e) { e.printStackTrace(); } } } Xử lý ngoại lệ 27 Ném ngoại lệ từ main() Nếu khơng có phương thức bắt ngoại lệ, ngoại lệ truyền lên phương thức main() cần xử lý Nếu khơng muốn xử lý ngoại lệ, để ngoại lệ truyền lên mức điều khiển máy ảo cách khai báo main() ném ngoại lệ chương trình bị dừng hệ thống in thông tin ngoại lệ Console (printStackTrace()) Xử lý ngoại lệ 28 Ví dụ import java.io.*; public class Echo { public static void main(String[] args) throws IOException { InputStreamReader reader; BufferedReader bufReader; reader = new InputStreamReader(System.in); bufReader = new BufferedReader(reader); String s; while( null != (s = bufReader.readLine()) System.out.println(s); } } Xử lý ngoại lệ 29 Hai loại ngoại lệ Java phân biệt hai loại ngoại lệ ngoại lệ cần kiểm tra ngoại lệ không cần kiểm tra Ngoại lệ cần kiểm tra: chương trình dịch ln kiểm tra xem có viết code xử lý với ngoại lệ không (try catch/ throws) IOException Ngoại lệ không cần kiểm tra: ngoại lệ loại trừ viết chương trình tốt RuntimeException Xử lý ngoại lệ 30 Ví dụ: Checked Exception InputStreamReader reader; BufferedReader bufReader; reader = new InputStreamReader(System.in); bufReader = new BufferedReader(reader); try { String s = bufReader.readLine(); } catch (IOException e) { } Xử lý ngoại lệ 31 Ví dụ: Unchecked Exception int num1 = Integer.ValueOf(str1).intValue(); int num2 = Integer.ValueOf(str2).intValue(); int num3 = num1 / num2; Hầu hết ngoại lệ thuộc lớp RuntimeException hệ thống ném tự động lỗi số học lỗi số Xử lý ngoại lệ 32 Hốn đổi ngoại lệ Có thể đổi ngoại lệ cần kiểm tra thành ngoại lệ không cần kiểm tra chưa biết nên làm void wrapException() { try { throw new IOException(); } catch (IOException e) { throw new RuntimeException(e); } } Xử lý ngoại lệ 33 try { wrapException(); } catch (RuntimeException e) { try { throw e.getCause(); } catch (IOException e1) { … } } Xử lý ngoại lệ 34 Tự định nghĩa ngoại lệ Chúng ta tạo lớp ngoại lệ để phục vụ mục đích riêng Lớp ngoại lệ phải kế thừa từ lớp Exception lớp dẫn xuất lớp Có thể cung cấp hai constructor constructor mặc định (không tham số) constructor nhận tham số String truyền tham số cho phương thức khởi tạo lớp sở Xử lý ngoại lệ 35 Ví dụ class SimpleException extends Exception { } class MyException extends Exception { public MyException() {} public MyException(String msg) { super(msg); } } Xử lý ngoại lệ 36 Khởi tạo đối tượng xử lý ngoại lệ Làm để thông báo hàm khởi tạo đối tượng gặp lỗi khơng có giá trị trả lại Một cách khởi tạo với trạng thái đặc biệt hi vọng có mã chương trình kiểm tra trạng thái Cách hợp lý ném ngoại lệ Xử lý ngoại lệ 37 class InputFile { public InputFile(String fname) throws IOException { } } try { InputFile fin = new InputFile(”data.txt”); } catch (IOException e) { System.err.println(e.getMessage); } Xử lý ngoại lệ 38 Bài tập thực hành Tìm hiểu phả hệ ngoại lệ Java Thực hành ném bắt ngoại lệ khai báo phương thức ném ngoại lệ constructor ném ngoại lệ tự định nghĩa ngoại lệ Xử lý ngoại lệ 39 ...Nội dung Khái niệm xử lý ngoại lệ (exception handling) Ném bắt ngoại lệ Khai báo ngoại lệ Ném lại ngoại lệ Định nghĩa ngoại lệ Xử lý ngoại lệ constructor Xử lý ngoại lệ Tài liệu tham... ném bắt ngoại lệ ném ngoại lệ: dừng chương trình chuyển điều khiển lên mức (nơi bắt ngoại lệ) bắt ngoại lệ: xử lý với ngoại lệ Ngoại lệ: đối tượng mang thông tin lỗi xảy ngoại lệ ném tự... ngoại lệ ném tường minh Xử lý ngoại lệ Phả hệ ngoại lệ Java Xử lý ngoại lệ Ưu điểm ném bắt ngoại lệ Dễ sử dụng Dễ dàng chuyển điều khiển đến nơi có khả xử lý ngoại lệ ném nhiều loại ngoại