Giới thiệu về biệt lệ:
- Là 1 kiểu lỗi đặc biệt, xảy ra trong thời gian thực thi khối lệnh và có thể gây ngừng đột ngột chương trình.
- Các lỗi thường gây nên biệt lệ:
Tràn bộ nhớ
Lỗi cấp phát tài nguyên
Không tìm thấy file
Lỗi kết nối
30 trang |
Chia sẻ: diunt88 | Lượt xem: 2594 | Lượt tải: 1
Bạn đang xem trước 20 trang tài liệu Lập trình Java toàn tập_P3: Xử lý biệt lệ, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Xử lý biệt lệ Giới thiệu về biệt lệ Là 1 kiểu lỗi đặc biệt, xảy ra trong thời gian thực thi khối lệnh và có thể gây ngừng đột ngột chương trình. Các lỗi thường gây nên biệt lệ: Tràn bộ nhớ Lỗi cấp phát tài nguyên Không tìm thấy file Lỗi kết nối Mục đích của việc xử lý biệt lệ Giảm thiểu việc kết thúc bất thường của hệ thống và của chương trình. Ví dụ: khi đang thao tác trên 1 tập tin nếu gặp lỗi mà không xử lý và chương trình kết thúc đột ngột thì file sẽ không được đóng và có thể dẫn đến hư file và các nguồn tài nguyên sẽ không được giải phóng. Java API Exception Hierachy Check – Uncheck Exception Hầu hết các lỗi đều nhận tự động từ RuntimeException, do đó không cần phải throws. Các biệt lệ dạng Check Exception (Exception) là các biệt lệ được trình biên dịch Java kiểm tra xem các phương thức có ném các biệt lệ được liệt kê hay không thông qua throws. Các biệt lệ dạng Uncheck Exception (Error) là các biệt lệ được ném ra do lỗi lập trình bất ngờ. Các biệt lệ này phải được xử lý bằng cách sửa lại mã nguồn. Ví dụ Lỗi??? public static void main(String[] args) { int d = 0; int a = 10/d; } Lớp Error(1) Các biệt lệ thuộc lớp Error có tính chất nghiêm trọng thường liên quan tới hệ thống và chưa được kiểm tra. Khi biệt lệ Error xảy ra thì chương trình thường sẽ bị dừng Lớp Error(2) Các lớp con của Error: ExceptionInInitializerError IncompatibleClassChangeError InternalError NoClassDefFoundError NoSuchMethodError StackOverflowError UnknownError UnsupportedClassVersionError VirtualMachineError Các lớp con của Error: AbstractMethodError ClassFormatError IllegalAccessError LinkageError NoSuchFieldError OutOfMemoryError ThreadDeath UnsatisfiedLinkError VerifyError ClassCircularityError Lớp Error(3) Bạn không nên mở rộng lớp Error vì: Các biệt lệ Error chưa được kiểm tra trình biên dịch không kiểm soát được được phương thức(đã kiểm tra hay bắt lỗi chưa) Các biệt lệ chưa được kiểm tra không cần throws nên không xác định được dòng nào gây lỗi. Có thể gây nên 1 số lỗi hệ thống khi cố gắng thực thi các Error này. Lớp Exception Các biệt lệ thộc về lớp Exception là các biệt lệ đã được kiểm tra Phương thức ném các biệt lệ trong mệnh đề throws Trình biên dịch sẽ kiểm tra xem các lỗi này có được bắt trong các câu lệnh try-catch hay không. Lớp RuntimeException(1) Được mở rộng từ lớp Exception Là các biệt lệ dạng Unchecked Exception Ít nghiêm trọng hơn Error, thường báo lỗi lập trình cần phải xử lý ở mã nguồn. Dạng lỗi này không sửa được trong quá trình thi hành. Không nên mở rộng từ RuntimeException và không nên bắt dạng ngoại lệ này. Lớp RuntimeException(2) Các lớp con của RuntimeException: ClassCastException EmptyStackException IllegalMonitorStateException IllegalThreadStateException MissingResourceException NoSuchElementException (catch được) IndexOutOfBoundsException StringIndexOutOfBoundsException ArrayIndexOutOfBoundsException UnsupportedOperationException Các lớp con của RuntimeException: ArithmeticException ArrayStoreException ConcurrentModificationException IllegalArgumentException IllegalStateException NumberFormatException(catch được) NegativeArraySizeException NullPointerException SecurityException UndeclaredThrowableException Quá trình xử lý lỗi Xác định loại lỗi và đoạn lệnh xảy ra lỗi Xác định cơ chế bắt lỗi Xác định vị trí đoạn lệnh cần viết để bắt lỗi Xác định thông báo sẽ hiển thị nếu lỗi xảy ra Viết đoạn lệnh xử lý lỗi Lưu, biên dịch và chạy chương trình Xử lý biệt lệ như thế nào? Khi 1 biệt lệ xảy ra thì một đối tượng tương ứng sẽ được tạo ra. Đối tượng sẽ được truyền tới phương thức nơi mà biệt lệ xảy ra. Đối tượng này chứa các thông tin chi tiết về biệt lệ, các thông tin này sẽ có thể được nhận và xử lý. Lớp “Throwable” của Java là lớp cha của tất cả các biệt lệ Biệt lệ Mô hình xử lý biệt lệ Các mô hình dùng để xử lý biệt lệ: Try-catch-finally Throw / throws Try-catch-finally (1) Sử dụng khối try, catch, finally để bắt giữ các ngoại lệ Khối lệnh có thể ném ngoại lệ Khối lệnh sẽ thực hiện nếu ngoại lệ xảy ra Khối lệnh sẽ thực hiện bất chấp ngoại lệ xảy ra hay không Try-catch-finally (2) public static void method(String s) { try { System.out.println(Integer.parseInt(s)); } catch (NumberFormatException e) { System.out.println("wrong fomat"); } finally{ System.out.println(“String s = ”+s); } } Mô hình catch-throw nâng cao Người lập trình chỉ quan tâm tới các lỗi khi cần thiết. Một thông báo lỗi có thể được cung cấp trong exception-handler. Khối try-catch(1) Được sử dụng để thực hiện trong mô hình “cacth and throw” của xử lý biệt lệ. Khối lệnh try gồm tập hợp các lệnh thực thi có thể xảy ra lỗi. Một phương thức có bắt biệt lệ bao gồm: 1 khối lệnh try 1 hoặc nhiều khối lệnh catch Một phương thức mà có thể bắt biệt lệ cũng bao gồm khối lệnh try Khối lệnh catch dùng để bắt biệt lệ trong khối try Khối try-catch(2) Để bắt bất kì một biệt lệ nào cũng cần chỉ ra kiểu biệt lệ là “Exception” Khi không biết rõ biệt lệ thuộc lớp nào ta có thể dùng lớp cha “Exception” để bắt. Lỗi sẽ được truyền thông qua khối lệnh try-catch cho đến khi nó gặp 1 catch tham chiếu tới nó hoặc chương trình sẽ kết thúc Khối lệnh chứa nhiều catch Các khối chứa nhiều catch sẽ xử lý các kiểu biệt lệ một cách độc lập. try{ doFileProcessing(); displayResults(); } catch(LookupException e){ handleLookupException(e); } catch(Exception e){ System.err.println(“Error:”+e.printStackTrace()); } Khối lệnh chứa nhiều try Khi sử dụng các khối try lồng nhau, thì khối try trong cùng sẽ được thực thi đầu tiên. Bất kỳ biệt lệ nào bị chặn trong khối lệnh try sẽ bị bắt giữ trong khối catch liền sau nó. Nếu không tìm thấy khối catch thích hợp thì sẽ xét đến khối catch bên ngoài. Ngược lại JRE sẽ xử lý biệt lệ. Khối finally(1) Khối finally là không bắt buộc Được đặt sau khối catch Luôn được thực thi bất chấp có biệt lệ hay không Khối finally(2) Thực thi tất cả các việc thu dọn khi biệt lệ xảy ra. Có thể sử dụng kết hợp với khối try Chứa các câu lệnh thu hồi tài nguyên cho hệ thống hay in các câu lệnh thông báo. Đóng tập tin Đóng bộ kết quả(sử dụng trong CSDL) Đóng các kết nối Throw và Throws(1) Các biệt lệ được chặn bởi sự trợ giúp của từ khóa throw. Throw giúp cỉ ra biệt lệ vừa xảy ra. Toán hạng của throw là một đối tượng của 1 lớp mà lớp này được dẫn xuất từ Throwable try{ if (flag < 0){ throw new MyException( ) ; // user-defined } } Throw và Throws(2) Một phương thức đơn có thể được chặn bởi nhiều biệt lệ. public class Example { public void exceptionExample( ) throws ExException, LookupException { try{ // statements } catch(ExException exmp) { …. } catch(LookupException lkpex) { …. } } } Throw và Throws(3) Lớp Exception thực thi giao diện Throwable và cung cấp các tính năng hữu dụng để phân phối các biệt lệ. Một lớp con của lớp Exception là một biệt lệ mới có thể bắt giữ độc lập các Throwable khác nhau. Sumary Các biệt lệ thường gặp RuntimeException ArithmeticException IllegalAccessException IllegalArgumentException ArrayIndexOutOfBoundsException NullPointerException SecurityException ClassNotFoundException NumberFormatException AWTException IOException FileNotFoundException EOFException NoSuchMethodException InterruptedException