Java - Chương 4: Ngoại lệ
Phân loại lỗi Ngoại lệ Xử lý ngoại lệ Phân cấp ngoại lệ trong Java Ngoại lệ do người dùng định nghĩa
Bạn đang xem trước 20 trang tài liệu Java - Chương 4: Ngoại lệ, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Chương 4.2Ngoại lệChương 4.2: Ngoại lệPhân loại lỗiNgoại lệXử lý ngoại lệPhân cấp ngoại lệ trong JavaNgoại lệ do người dùng định nghĩaPhân loại lỗiLỗi cú phápLỗi thực thiLỗi luận lýNgoại lệimport java.util.*;public class Exception_Ex1 {public static void main(String[] args){ Scanner scanIn=new Scanner(System.in);System.out.print("Enter the first number (a):");int a = scanIn.nextInt();System.out.print("Enter the second number (b):");int b = scanIn.nextInt();System.out.print("a/b = " + a/b);}}Ngoại lệXử lý ngoại lệ truyền thốngViết mã xử lý tại nơi phát sinh ra lỗiLàm cho chương trình trở nên rốiKhô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ýTruyền trạng thái lên mức trênThông qua tham số, giá trị trả lại hoặc biến tổng thể (flag) Dễ nhầmVẫn còn khó hiểuXử lý ngoại lệ truyền thốngKhó kiểm soát được hết các trường hợpLỗi số học, lỗi bộ nhớ,Lập trình viên thường quên không xử lý lỗiBản chất con ngườiThiếu kinh nghiệm, cố tình bỏ quaMục đích xử lý ngoại lệDễ sử dụngDễ dàng chuyển điều khiển đến nơi có khả năng xử lý ngoại lệCó thể ném nhiều loại ngoại lệTách xử lý ngoại lệ khỏi thuật toánTách mã xử lýSử dụng cú pháp khácKhông bỏ sót ngoại lệ (ném tự động)Làm chương trình dễ đọc hơn, an toàn hơn.Xử lý ngoại lệpublic static void main(String[] args){System.out.print("Enter the first number (a):");Scanner scanIn=new Scanner(System.in);int a = scanIn.nextInt();System.out.print("Enter the second number (b):");int b = scanIn.nextInt();try{ System.out.print("a/b = " + a/b); //đoạn code có khả năng xảy ra ngoại lệ}catch(ArithmeticException ex){ System.out.print(“Không được chia cho 0"); //đoạn code xử lý ngoại lệ}}Xử lý ngoại lệpublic static void main(String[] args){System.out.print("Enter the first number (a):");Scanner scanIn=new Scanner(System.in);int a = scanIn.nextInt();System.out.print("Enter the second number (b):");int b = scanIn.nextInt();try{ System.out.print("a/b = " + a/b); //đoạn code có khả năng xảy ra ngoại lệ}catch(Exception e){ System.err.println("Co loi xay ra: " + e.toString()); //đoạn code xử lý ngoại lệ}}Xử lý ngoại lệKhối try – catch lồng nhau Những phần nhỏ trong khối mã sinh ra một lỗi, nhưng toàn bộ cả khối thì lại sinh ra một lỗi khác-> Cần có các xử lý ngoại lệ lồng nhau. Khi các khối try lồng nhau, khối try bên trong sẽđược thực hiện trước.try { // Doan code co the gay ra IOException try { // Doan ma co the gay ra NumberFormatException } catch (NumberFormatException e1) { // Xu ly loi sai dinh dang so } } catch (IOException e2) { // Xu ly loi vao ra }Nhiều khối catch Một đoạn mã có thể gây ra nhiều hơn một ngoại lệ ->Sử dụng nhiều khối catchtry { // Doan ma co the gay ra nhieu ngoai le, loi nhap/xuat, chia cho 0,} catch (ExceptionType1 e1) { // Xu ly ngoai le 1} catch (ExceptionType2 e2) { // Xu ly ngoai le 2}Nhiều khối catchclass MultipleCatch1{ public static void main(String args[]){ try{ String num = args[0]; int numValue = Integer.parseInt(num); System.out.println("Dien tich hv la: " + numValue * numValue); }catch(ArrayIndexOutOfBoundsException e1) { System.out.println(“Hay nhap canh cua hv!"); } catch(NumberFormatException e2){ System.out.println(“Hay nhap 1 so!"); } }} 18Khi 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 (ví dụ như đóng file).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.Khối FINALLYFileInputStream f = null; try { f = new FileInputStream(“d:/somefile.txt"); // đọc file } catch (IOException e) { // hiển thị lỗi} finally { if (f != null) { try { f.close(); // đóng file } catch (Exception e) { // thông báo lỗi khi đóng file } }}Khối FINALLYPhân cấp ngoại lệ trong JavaClassNotFoundExceptionThrowableErrorExceptionRuntimeExceptionAssertionErrorIOExceptionObjectNullPointerExceptionArithmeticException21Lớp ThrowableCó một biến String để lưu thông tin chi tiết về ngoại lệ đã xảy raMột số phương thức cơ bảnThrowable(String s); // Tạo một ngoại lệ có tên là s.String getMessage(); // Lấy thông tin về ngoại lệvoid printStackTrace(); // In ra tất cả các thông tin liên quan đến ngoại lệMột số ngoại lệ22Lớp ExceptionCó nhiều ngoại lệ thuộc lớp con của Exception.Người dùng có thể tạo ra các ngoại lệ kế thừa từ Exception.Lớp ErrorChỉ những lỗi nghiêm trọng và không dự đoán trước được như ThreadDead, LinkageError, VirtualMachineError...Các ngoại lệ kiểu Error ít được xử lý.Một số ngoại lệ23RuntimeException: Chỉ các ngoại lệ có thể xảy ra khi JVM thực thi chương trìnhNullPointException: con trỏ nullOutOfMemoryException: hết bộ nhớArithmeticException: lỗi toán học, lỗi chia khôngClassCastException: lỗi ép kiểuArrayIndexOutOfBoundsException: vượt quá chỉ số mảng...Một số ngoại lệ24Ngoại lệ uncheckedLà các ngoại lệ không bắt buộc phải được kiểm tra.Gồm RuntimeException, Error và các lớp con của chúng.Ngoại lệ checkedLà các ngoại lệ bắt buộc phải được kiểm tra.Gồm các ngoại lệ còn lại.Hai loại ngoại lệ25Giả sử method1 gọi method2 và method2 là phương thức có khả năng ném ngoại lệ kiểu checked, lúc đó:hoặc method2 phải nằm trong khối try/catch.hoặc phải khai báo method1 có khả năng ném (throws) ngoại lệ.Chú ý với ngoại lệ Checked26Cách 1: try/catchpublic static void main(String[] args){ try { String s = buff.readLine(); } catch (IOException e) { ... }}Cách 2: Khai báo throwspublic static void main(String[ ] args) throws IOException{ String s = buff.readLine();}Ví dụ:public class MyException extends Exception{ public MyException(String msg) { super(msg); }}Tên lớp ngoại lệ mớiThừa kế từ lớp ExceptionGọi phương thức của lớp chaNgoại lệ do người dùng tự định nghĩaBước 1: Định nghĩa ngoại lệ (tạo class tên MyException)28Bước 2: Xây dựng ngoại lệ// file ExampleException.javapublic 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"); } Khai báo khả năng tung ngoại lệTung ngoại lệNgoại lệ do người dùng tự định nghĩa29Bước 3: 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()); } }}Ngoại lệ do người dùng tự định nghĩa