Tìm hiểu về Exception

I, Mở đầu

  • Exception là một sự kiện thường gặp trong khi tạo ra chương trinh.
  • Trong bài viết này, mình sẽ trình bày rõ hơn exception, hệ thống phân cấp và cơ chế JVM xử lý các exception.

II, Định nghĩa vầ phân cấp

  • Exception là sự kiện làm phá vớ luồng thực thi của chương trình.
  • Nếu chúng ta không xử lý các exception, Thread hiện tại là:
    • Main Thread: chương trình sẽ bị chết.
    • Không phải là main Thread: Thread sẽ bị ngắt.
  • Trong phân cấp exception thì Throwable class ở mức cao nhất.
  • Hai class con kế thừa ThrowableErrorException.
  • Chúng ta có thể chia exception thành 2 loại:
    • Unchecked exception: bao gồm ErrorRuntimeException.
    • Checked exception: các loại exception khác.

1, Checked exception

  • Checked exception hay còn gọi là compile time exception bời vì chúng xảy ra ở compile time.
  • Thông thường khi bạn compile chương trình nếu có checked exception, IDE sẽ thông báo cho chúng ta biết ngay.
  • Như mình đã nói ở trên tất cả các class kế thừa Exception class ngoại trừ RuntimeException đều là checked exception.
  • Các checked exception chúng ta hay gặp: FileNotFoundException, IOException

2, Unchecked exception

  • Unchecked exception hay còn gọi là runtime exception bởi vì chúng bị bỏ qua trong compile time và chỉ xảy ra ở runtime.
  • Chúng thường xảy ra do bug, logic… của chương trình cũng có thể do môi trường của ứng dụng. Do đó chúng khó bị phát hiện và fix hơn.
  • Các class kế thừa ErrorRuntimeException đều là unchecked exception.
  • Các unchecked exception chúng ta hay gặp: NullPointerException, ArrayIndexOutOfBoundException, NumberFormatException

III, Cơ chế JVM xử lý các Exception

  • Exception Handling là cơ chế xử lý các exception ở runtime để có thể duy trì luồng thực thi của chương trình.
  • Exception Handling được thực hiện bằng try/catch block.
  • Nếu trong try block xảy ra Exception, code trong try sẽ không được thực thi nữa. JVM sẽ tìm kiếm catch block có xử lý Exception đó.
  • Nếu không có catch block hay catch block không xử lý đúng Exception bị throw, code thực thi finally block và ngắt Thread hiện tại.
  • Nếu catch block xử lý đúng Exception, code tiếp tục thực thi đến khi hết catch, sau đó finally thực thi Thread như thông thường.

IV, Một số lưu ý

  • Khi code trong try block throw Exception, các catch sẽ được check theo thứ tự thực thì.
  • Khi 1 catch block đã được thực thi, các catch block theo sau sẽ bị bỏ qua.
  • Các catch nên được sắp xếp để xử lý theo thứ từ Exception con tới Exception cha. Ví dụ: chúng ta nên catch NumberFormatException trước khi catch Exception.
  • Khối finally luôn được thực hiện dù Exception có được catch hay không. Nó sẽ không được thực thi khi System.exit() được gọi hay Error mà môi trường không xử lý được xảy ra.
  • Đối với mỗi try block, có thể không có hoặc có 1 hoặc nhiều catch block nhưng sẽ chỉ có 1 finally block.