Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 36 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
36
Dung lượng
202,75 KB
Nội dung
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 Nguyễn Việt Hà Xử lý ngoại lệ Tài liệu tham khảo Thinking in Java, chapter Java how to program, chapter 15 Nguyễn Việt Hà 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 Nguyễn Việt Hà để 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 Nguyễn Việt Hà Xử lý ngoại lệ Ví dụ int devide(int num, int denom, int& error) { if (0 != denom) { error = 0; return num/denom; } else { error = 1; return 0; } } Nguyễn Việt Hà Xử lý ngoại lệ Xử lý ngoại lệ (Exception handling) Java Xử lý ngoại lệ Java kế thừa từ C++ Dựa chế ném bắt ngoại lệ 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ệ ném Ngoại lệ: đối tượng mang thông tin lỗi xảy lệ ném tự động ngoại lệ ném tường minh ngoại Nguyễn Việt Hà Xử lý ngoại lệ Phả hệ ngoại lệ Java Nguyễn Việt Hà Xử lý ngoại lệ Ưu điểm ném bắt ngoại lệ Dễ sử 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ệ dàng 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 Nguyễn Việt Hà Xử lý ngoại lệ Ném ngoại lệ (tường minh) Ném ngoại lệ câu lệnh throw if (0==denominator) { throw new Exception(); } else res = nominator / denominator; Nguyễn Việt Hà 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; } Nguyễn Việt Hà Xử lý ngoại lệ 22 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 Nguyễn Việt Hà chương trình Xử lý ngoại lệ 23 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(); } } } Nguyễn Việt Hà Xử lý ngoại lệ 24 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()) Nguyễn Việt Hà Xử lý ngoại lệ 25 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); } } Nguyễn Việt Hà Xử lý ngoại lệ 26 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 Nguyễn Việt Hà Xử lý ngoại lệ 27 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) { } Nguyễn Việt Hà Xử lý ngoại lệ 28 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ố Nguyễn Việt Hà Xử lý ngoại lệ 29 Hoá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); } } Nguyễn Việt Hà Xử lý ngoại lệ 30 try { wrapException(); } catch (RuntimeException e) { try { throw e.getCause(); } catch (IOException e1) { … } } Nguyễn Việt Hà Xử lý ngoại lệ 31 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 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ở constructor Nguyễn Việt Hà Xử lý ngoại lệ 32 Ví dụ class SimpleException extends Exception { } class MyException extends Exception { public MyException() {} public MyException(String msg) { super(msg); } } Nguyễn Việt Hà Xử lý ngoại lệ 33 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ệ Nguyễn Việt Hà Xử lý ngoại lệ 34 class InputFile { public InputFile(String fname) throws IOException { } } try { InputFile fin = new InputFile(”data.txt”); } catch (IOException e) { System.err.println(e.getMessage); } Nguyễn Việt Hà Xử lý ngoại lệ 35 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ệ Nguyễn Việt Hà Xử lý ngoại lệ 36 ... 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 Nguyễn Việt Hà Xử lý ngoại lệ Tài liệu... Hà Xử lý ngoại lệ Xử lý ngoại lệ (Exception handling) Java Xử lý ngoại lệ Java kế thừa từ C++ Dựa chế ném bắt ngoại lệ 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ệ) ... lệ) bắt ngoại lệ: xử lý với ngoại lệ ném Ngoại lệ: đối tượng mang thông tin lỗi xảy lệ ném tự động ngoại lệ ném tường minh ngoại Nguyễn Việt Hà Xử lý ngoại lệ Phả hệ ngoại lệ Java Nguyễn