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
Throwable
là Error
và Exception
.
- Chúng ta có thể chia exception thành 2 loại:
- Unchecked exception: bao gồm
Error
và RuntimeException
.
- 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
Error
và RuntimeException
đề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.