Lỗi và Ngoại lệ

Kiểu dữ liệu và Exceptions trong Java

Jim White

Java Developer

Ngoại lệ vs Lỗi

  • Error là sự cố nghiêm trọng
  • Ứng dụng không thể xử lý/khôi phục sau lỗi
    • Lỗi làm ứng dụng "crash" hoặc dừng
    • Ví dụ: hết bộ nhớ là lỗi trong Java
  • Ứng dụng có thể xử lý/khôi phục sau ngoại lệ
    • Ví dụ: truy cập ngoài kích thước mảng là ngoại lệ.
Kiểu dữ liệu và Exceptions trong Java
Ví dụ Lỗi
import java.util.*;

public class CauseOutOfMemory {
    public static void main(String[] args) {
        List<Long> numbers = new ArrayList<Long>();
        long counter = 0;
        while (true) {
            numbers.add(counter);
            counter++;
        }
    }
}
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at java.base/java.lang.Long.valueOf(Long.java:1204)
    at foo/exceptions.CauseOutOfMemory.main(CauseOutOfMemory.java:12)
Kiểu dữ liệu và Exceptions trong Java

Hai loại ngoại lệ

Ngoại lệ được kiểm tra Ngoại lệ Runtime ("không kiểm tra")
Yêu cầu xử lý Không
Nguyên nhân chung Yếu tố ngoài tầm kiểm soát Lỗi lập trình của chúng ta
Khả năng khôi phục Thường có thể nếu dự liệu trước Thường không thể
Cách khôi phục try/catch hoặc throws Nên viết code cẩn thận để tránh
Ví dụ ngoại lệ Không tìm thấy tệp Vượt chỉ số mảng
Kiểu dữ liệu và Exceptions trong Java

Ngoại lệ Checked và Runtime

  • Các lớp con của Exception không phải là lớp con của RuntimeExceptionngoại lệ được kiểm tra
    • Bắt buộc phải xử lý
    • Ví dụ: không tìm thấy tệp (FileNotFoundException)
  • RuntimeException là lớp cha của mọi ngoại lệ không kiểm tra
    • Không bắt buộc xử lý
    • Ví dụ: truy cập chỉ số mảng không tồn tại (IndexOutOfBoundsException)
    • Ví dụ: chia cho 0 (ArithmeticException)
Kiểu dữ liệu và Exceptions trong Java

RuntimeException

Lớp con RuntimeException Khi nào ném
ArithmeticException Tính toán sai như chia cho 0
IndexOutOfBoundsException Dùng chỉ số cho mảng, String, v.v. vượt phạm vi
NegativeArraySizeException Tạo mảng với kích thước âm
int y = 5/0; // Mã gây ArithmeticException
int[] list = new int[-1];  // Mã gây NegativeArraySizeException
Exception in thread "main" java.lang.ArithmeticException: / by zero
Exception in thread "main" java.lang.NegativeArraySizeException: -1
1 Xem https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/RuntimeException.html
Kiểu dữ liệu và Exceptions trong Java

Ngoại lệ "được kiểm tra"

public class LoadClass {
    public static void main(String[] args) {
        Class myClass = Class.forName("com.mysql.Driver");
    }
}
LoadClass.java:3: error: unreported exception ClassNotFoundException; 
must be caught or declared to be thrown
                Class myClass = Class.forName("com.mysql.Driver");
                                             ^
1 error
1 Xem https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Exception.html
Kiểu dữ liệu và Exceptions trong Java

Ayo berlatih!

Kiểu dữ liệu và Exceptions trong Java

Preparing Video For Download...