3. Gói ngoại lệ

Các trường hợp ngoại lệ được kiểm tra có vẻ hay về mặt lý thuyết, nhưng hóa ra lại là một sự thất vọng lớn trong thực tế.

Giả sử bạn có một phương pháp siêu phổ biến trong dự án của mình. Nó được gọi từ hàng trăm nơi trong chương trình của bạn. Và bạn quyết định thêm một ngoại lệ được kiểm tra mới vào nó. Và có thể ngoại lệ được kiểm tra này thực sự quan trọng và đặc biệt đến mức chỉ main()phương thức mới biết phải làm gì nếu nó bị bắt.

Điều đó có nghĩa là bạn sẽ phải thêm ngoại lệ được kiểm tra vào throwsmệnh đề của mọi phương thức gọi phương thức siêu phổ biến của bạn . Cũng như trong throwsmệnh đề của tất cả các phương thức gọi các phương thức đó. Và của các phương thức gọi các phương thức đó.

Kết quả là, throwscác mệnh đề của một nửa số phương pháp trong dự án có một ngoại lệ được kiểm tra mới . Và tất nhiên, dự án của bạn được bao phủ bởi các bài kiểm tra và bây giờ các bài kiểm tra không được biên dịch. Và bây giờ bạn cũng phải chỉnh sửa các mệnh đề ném trong các bài kiểm tra của mình.

Và sau đó tất cả mã của bạn (tất cả các thay đổi trong hàng trăm tệp) sẽ phải được xem xét bởi các lập trình viên khác. Và tại thời điểm này, chúng tôi tự hỏi tại sao chúng tôi lại thực hiện quá nhiều thay đổi đẫm máu đối với dự án? (Những) ngày làm việc và các bài kiểm tra bị hỏng - tất cả chỉ vì mục đích thêm một ngoại lệ được kiểm tra ?

Và tất nhiên, vẫn có những vấn đề liên quan đến kế thừa và ghi đè phương thức. Các vấn đề đến từ các ngoại lệ được kiểm tra lớn hơn nhiều so với lợi ích. Điểm mấu chốt là bây giờ ít người yêu thích chúng và ít người sử dụng chúng.

Tuy nhiên, vẫn còn rất nhiều mã (bao gồm cả mã thư viện Java chuẩn) chứa các ngoại lệ được kiểm tra này . Phải làm gì với chúng? Chúng tôi không thể bỏ qua chúng và chúng tôi không biết làm thế nào để xử lý chúng.

Các lập trình viên Java đã đề xuất bọc các ngoại lệ đã kiểm tra trong RuntimeException. Nói cách khác, hãy nắm bắt tất cả các ngoại lệ được kiểm tra , sau đó tạo các ngoại lệ không được kiểm tra (ví dụ: RuntimeException) và ném chúng thay vào đó. Làm điều đó trông giống như thế này:

try
{
   // Code where a checked exception might occur
}
catch(Exception exp)
{
   throw new RuntimeException(exp);
}

Đó không phải là một giải pháp hay lắm, nhưng không có gì tội phạm ở đây: ngoại lệ chỉ đơn giản là được nhét vào bên trong tệp RuntimeException.

Nếu muốn, bạn có thể dễ dàng lấy nó từ đó. Ví dụ:

Mã số Ghi chú
try
{
   // Code where we wrap the checked exception
   // in a RuntimeException
}
catch(RuntimeException e)
{
   Throwable cause = e.getCause();
   if (cause instanceof Exception)
   {
      Exception exp = (Exception) cause;
      // Exception handling code goes here
   }
}







Nhận ngoại lệ được lưu trữ bên trong RuntimeExceptionđối tượng. Biến causecó thể null

Xác định loại của nó và chuyển nó thành loại ngoại lệ được kiểm tra .