2015-06-01 14 views
5

Hãy tha thứ cho tôi nếu đây là một câu hỏi ngu ngốc, nhưng theo như tôi biết, tất cả các trường hợp ngoại lệ Java phải bị bắt và xử lý. Ví dụ, một cái gì đó như thế này sẽ tạo ra một lỗi biên dịch:Làm thế nào để các chương trình Java có thể gặp lỗi khi ngoại lệ phải luôn luôn bị bắt?

public String foo(Object o) { 
    if (o instanceof Boolean) { 
     throw new Exception(); 
    } 
    return o.toString(); 
} 

Bởi vì phương pháp foo() không thêm một điều khoản throws.
Tuy nhiên, ví dụ này sẽ làm việc (trừ khi một trong hai phương pháp foo() không có một điều khoản throws hoặc phương pháp bar() không xung quanh việc sử dụng của foo() trong một khối try/catch):

public String foo(Object o) throws Exception { 
    if (o instanceof Boolean) { 
     throw new Exception(); 
    } 
    return o.toString(); 
} 

public void bar(Object o) { 
    try { 
     String s = foo(o); 
    } 
    catch (Exception e) { 
     //... 
    } 
    //... 
} 

Cuối cùng, đôi khi một chương trình Java đôi khi vẫn gặp sự cố do một trường hợp ngoại lệ unhandled.

Điều này xảy ra như thế nào?

+0

Chúng không phải lúc nào cũng bị bắt và xử lý. Đó là vấn đề. –

+3

Tất cả [** biểu thức được chọn **] (https://docs.oracle.com/javase/tutorial/essential/exceptions/runtime.html) ... –

+0

Cung cấp dấu vết ngăn xếp của bạn để chúng tôi có thể xem ngoại lệ là gì. – Alex

Trả lời

5

Bạn không phải xử lý tất cả các loại ngoại lệ.

Exceptions mà kế thừa từ java.lang.RuntimeException hoặc java.lang.Error được cái gọi là trường hợp ngoại lệ được kiểm soát có thể được khai thác bởi một cấu trúc try-catch, họ không phải là, mặc dù.

Như bạn có thể thấy trong tài liệu API của java.lang.Error, nó không được kế thừa từ java.lang.Exception. Vì lý do này, nó sẽ không bị chặn bởi khối try-catch của bạn - bạn chỉ tìm kiếm java.lang.Exception và các lớp con của nó.

Hãy xem this article in the docs.

1

Một số ngoại lệ có thể được bỏ chọn, chúng được gọi là Ngoại lệ thời gian chạy. Ví dụ: IllegalArumentException là một ngoại lệ không được kiểm soát vì nó là hậu duệ của java.lang.RuntimeException. Bạn có thể đọc về nó here.

Các vấn đề liên quan