1. Ngoại lệ (exceptions) trong Java là gì?
Một ngoại lệ (exception) là một sự kiện bất ngờ xảy ra trong quá trình thực thi chương trình. Nó có thể khiến chương trình kết thúc bất thường. Có nhiều nguyên nhân gây ra ngoại lệ như:
- Người dùng nhập dữ liệu không hợp lệ
- Lỗi thiết bị
- Mất kết nối mạng
- Giới hạn về phần cứng, có thể là hết bộ nhớ
- Lỗi code
- Mở file không hợp lệ
Bên dưới là một sơ đồ đơn giản của hệ thống phân cấp ngoại lệ trong Java.
Lớp Throwable là lớp gốc (root) của hệ thống phân cấp trên. Hệ thống phân cấp này chia thành 2 nhánh: Error và Exception.
Error kế thừa Throwable
Các error là các tình trạng bất thường, ảnh hưởng nghiêm trọng đến chương trình. Khi lỗi xảy ra thì gần như không thể khôi phục chương trình như máy ảo Java (JVM) hết bộ nhớ, lỗi tràn ngăn xếp, không tương thích thư viện, đệ quy vô hạn,…
Error thường nằm ngoài tầm kiểm soát của lập trình viên. Nhưng chúng ta cũng phải cố gắng hiểu chúng là lỗi gì và giải quyết như thế nào.
Một vài lớp con của lớp Error như:
- AnnotationFormatError xuất ra lỗi cho biết định dạng annotation không đúng.
- LinkageError xuất ra lỗi khi một lớp phụ thuộc vào một số lớp khác nhưng những lớp này đã bị thay đổi, không còn tương thích nữa. Lỗi này thường xảy ra do sự thay đổi version của các thư viện trong Java.
- VirtualMachineError xuất ra lỗi khi Java Virtual Machine (JVM) gặp trục trặc hoặc hết tài nguyên phần cứng để hoạt động.
Ví dụ một vài error được xuất ra màn hình của lớp Error
Error: LinkageError occurred while loading main class ClassName
java.lang.UnsupportedClassVersionError: ClassName has been
compiled by a more recent version of the Java Runtime
(class file version 55.0), this version of the Java Runtime
only recognizes class file versions up to 54.0
java.lang.annotation.AnnotationFormatError: Invalid default: public abstract java.lang.Class org.springframework.data.cassandra.repository.config.EnableCassandraRepositories.repositoryBaseClass()
java.lang.OutOfMemoryError: Java heap space
Exception in thread "main" java.lang.StackOverflowError
Exception kế thừa Throwable
Chương trình Java có thể phát hiện và xử lý được exception. Khi một ngoại lệ xảy ra trong một phương thức, nó sẽ tạo ra một đối tượng. Đối tượng này được gọi là exception object. Nó chứa thông tin về exception như tên và mô tả của exception và trạng thái của chương trình khi exception xảy ra.
Trong cây phân cấp, Exception gồm 2 nhánh: RuntimeException và IOException.
2. RuntimeException
Một runtime exception xảy ra bởi một lỗi lập trình (programming error). Runtime exception còn được gọi là unchecked exception.
Runtime exception không được kiểm tra lúc biên dịch nhưng được phát hiện lúc thực thi (runtime). Một vài runtime exception phổ biến như:
- IllegalArgumentException lỗi xảy ra khi truyền đối số không phù hợp cho phương thức
- NullPointerException lỗi truy cập con trỏ rỗng
- ArrayIndexOutOfBoundsException lỗi truy cập index của các phần tử không thuộc mảng
- ArithmeticException lỗi chia cho số 0
Những lỗi này đều là lỗi của lập trình viên. Ví dụ, NullPointerException sẽ không xảy ra nếu chúng ta kiểm tra biến được khởi tạo hay chưa trước khi sử dụng. ArrayIndexOutOfBoundsException sẽ không xảy ra nếu chúng ta kiểm tra phạm vi index của các phần tử trong mảng.
Ví dụ một vài error được xuất ra màn hình của RuntimeException
java.lang.IllegalArgumentException: adding container's parent to itself
java.lang.NullPointerException
at twoten.TwoTenB.<init>(TwoTenB.java:29)
at javapractice.JavaPractice.main(JavaPractice.java:32)
Java Result: 1
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
Exception in thread "main" java.lang.ArithmeticException: / by zero
3. IOException
Một IOException còn được gọi là checked exception. Chúng được trình biên dịch kiểm tra tại thời điểm biên dịch và lập trình viên được yêu cầu xử lý các ngoại lệ này.
Một số IOException phổ biến là:
- FileNotFoundException lỗi mở một file không tồn tại
- Lỗi đọc các dòng không có trong file
Ví dụ một vài error được xuất ra màn hình của IOException
Exception in thread "main" java.io.FileNotFoundException: file.txt (The system cannot find the file specified)
Exception in thread "main" java.io.IOException: Cannot run program "": error=2, No such a file or directory.
Ở bài này, chúng ta đã tìm hiểu các loại ngoại lệ (exception) trong Java. Chúng ta sẽ tìm hiểu cách xử lý ngoại lệ (exception) ở bài Cách xử lý ngoại lệ (exceptions) trong Java.