Sợ lỗi, nhưng đừng viết chúng bằng Java! Có thể bạn đã biết một số điều về ngoại lệ trong Java . Hôm nay, ít nhất một kiến ​​thức hời hợt sẽ có lợi cho bạn. Chúng ta sẽ phân tích lớp Lỗi và một loại ngoại lệ đặc biệt khiến nhiều người sợ hãi khi nó xuất hiện trong dấu vết ngăn xếp của họ.

Ở trên cùng của hệ thống phân cấp ngoại lệ của Java là lớp Throwable , lớp này có hai hậu duệ:

  • Exception , chịu trách nhiệm về các lỗi trong chương trình của bạn.
  • Và người hùng của chúng ta ngày hôm nay — Error , chịu trách nhiệm về các lỗi trong JVM.
    Điều đáng nói là đây có thể không phải là lỗi mã hóa, mà là các vấn đề thường không phụ thuộc vào nhà phát triển.

Phải làm gì với Lỗi

Khi bắt "lỗi", bạn không thể thực hiện bất kỳ hành động nào trong khối bắt , ngoại trừ ghi nhật ký , vì chúng ta đang nói về các sự cố trong chính JVM.

Ghi nhật ký là tốt: khi gặp lỗi thời gian chạy, bạn có thể xem nhật ký, xem nguyên nhân và biết cách khắc phục.

Vì bạn không biết mình có thể gặp phải loại lỗi nào khi viết mã, nên việc viết một loại lỗi cụ thể vào khối catch là vô nghĩa . Bản thân việc sử dụng lớp Error cũng không phải là giải pháp tốt nhất, vì trong trường hợp này, bạn sẽ chỉ gặp lỗi.

Theo đó, tốt hơn là sử dụng lớp Throwable , lớp có thể bắt cả LỗiNgoại lệ . Điều này trông như thế nào trong thực tế?

Viết mã như thế này là không ổn:

try {
    // Your code
} catch (OutOfMemoryError outOfMemoryError) {
    // Code to catch OutOfMemoryError
}
Viết mã như thế này cũng không ổn:

try {
    // Your code
} catch (Error error) {
    // Code to catch all Errors
}
Nhưng mã như thế này là OK:

try {
    // Your code
} catch (Throwable throwable) {
    // Code to catch all Throwables
}

Tùy chọn thứ hai để xử lý lỗi là ném chúng lên cao hơn sau khi khai báo mệnh đề ném trên phương thức. Kỹ thuật này được sử dụng khi mã của bạn về mặt lý thuyết có thể gây ra lỗi và bạn muốn cảnh báo trước cho những người có thể sử dụng mã của bạn để họ có thể xử lý lỗi đúng cách.

Lỗi thông thường

Một số lỗi phổ biến nhất là các lớp OutOfMemoryErrorStackOverflowError .

OutOfMemoryError thường xuất hiện khi chương trình không có đủ bộ nhớ để tạo đối tượng và bộ thu gom rác không thể theo kịp. Kết quả là lỗi OutOfMemoryError .

Java không cho phép bạn xóa các đối tượng theo cách thủ công để tránh rò rỉ bộ nhớ, nhưng bạn có thể tránh xả rác để bộ thu gom rác không làm việc quá sức và không làm lộn xộn đống.

Ví dụ, mã như thế này sẽ tạo ra rất nhiều rác trong bộ nhớ:


while (true) {
    new Object();
}

Lỗi thứ hai mà tôi muốn nói với bạn là StackOverflowError , lỗi này xảy ra khi ngăn xếp bị tràn. Vì ngăn xếp chủ yếu lưu trữ các biến cục bộ, tham số và lệnh gọi phương thức nên đệ quy (hoặc lệnh gọi phương thức đệ quy) là nguyên nhân rất phổ biến gây ra lỗi này:


public void foo() {
    foo();
}

Để tránh các sự cố trong quá trình thực thi chương trình, các IDE hiện đại thường cảnh báo về việc gọi các phương thức một cách đệ quy.

Bạn không thể sửa một chương trình gây ra Lỗi , nhưng bạn có thể viết mã không gây ra lỗi và làm hỏng chương trình của bạn. Xem những gì bạn làm với bộ nhớ, tạo các đối tượng một cách cẩn thận và gọi các phương thức một cách chính xác. Nếu bạn làm điều đó, thì bạn sẽ gặp ít vấn đề hơn trong mã của mình.

Sự khác biệt giữa các loại Lỗi và Ngoại lệ

Lỗi Ngoại lệ
Không thể sửa trong khối bắt Có thể được xử lý trong một khối bắt
Không xảy ra tại thời điểm biên dịch Có thể bị bắt tại thời gian biên dịch
Các vấn đề trong JVM Các vấn đề trong logic mã
Tất cả các lỗi đều không được chọn kiểm trabỏ chọn

Bạn không thể thoát khỏi các ngoại lệ trong Java, nhưng bạn không nên sợ chúng. Bạn chỉ cần hiểu mỗi loại đại diện cho điều gì và biết cách xử lý nó. Đó là tất cả cho ngày hôm nay! Thấy bạn!