2010-05-28 53 views
7

Tại sao bạn không thể ném một InterruptedException theo cách sau:ném ngoại lệ

try { 
    System.in.wait(5) //Just an example 
} catch (InterruptedException exception) { 
    exception.printStackTrace(); 
//On this next line I am confused as to why it will not let me throw the exception 
    throw exception; 
} 

tôi đến http://java24hours.com, nhưng nó không cho tôi biết tại sao tôi không thể ném một InterruptedException.
Nếu có ai biết tại sao, XIN VUI LÒNG hãy cho tôi biết! Tôi tuyệt vọng! : S

+0

Bạn gặp phải loại lỗi nào? – Simon

+0

Nó nói: ngoại lệ không được báo cáo java.lang.InterruptedException; phải bị bắt hoặc tuyên bố bị ném – fireshadow52

Trả lời

13

Bạn chỉ có thể ném nó nếu phương pháp bạn đang viết tuyên bố rằng nó ném InterruptedException (hoặc một lớp cơ sở).

Ví dụ:

public void valid() throws InterruptedException { 
    try { 
    System.in.wait(5) //Just an example 
    } catch (InterruptedException exception) { 
    exception.printStackTrace(); 
    throw exception; 
    } 
} 

// Note the lack of a "throws" clause. 
public void invalid() { 
    try { 
    System.in.wait(5) //Just an example 
    } catch (InterruptedException exception) { 
    exception.printStackTrace(); 
    throw exception; 
    } 
} 

Bạn nên đọc lên trên kiểm tra ngoại lệ để biết thêm chi tiết.

(Nói xong, gọi wait() trên System.in gần như chắc chắn không làm những gì bạn mong đợi nó ...)

+0

@Downvoter: Chăm sóc để giải thích? –

+0

Hoặc, anh ta có thể xử lý ngoại lệ trong khối 'catch'. Dù sao, giải thích tốt về cách ngoại lệ hoạt động. – amphetamachine

+0

Cảm ơn LOT! Điều đó thực sự đã giúp: D – fireshadow52

0

InterruptedException không phải là một RuntimeException vì vậy nó phải được bắt hoặc kiểm tra (với ném khoản trên chữ ký phương thức). Bạn chỉ có thể ném một RuntimeException và không bị buộc bởi trình biên dịch để bắt nó.

+0

Vâng, không hoàn toàn - bạn có thể tuyên bố rằng bạn sẽ ném nó để buộc người gọi * để bắt hoặc rethrow nó. –

+0

Tôi đã đề cập rằng trong câu đầu tiên, câu thứ hai của tôi nên đọc "... và không bị trình biên dịch buộc phải" xử lý "nó." Điều đó sẽ rõ ràng hơn. –

3

Có hai loại ngoại lệ trong Java: kiểm trabỏ chọn ngoại lệ.

Đối với ngoại lệ được kiểm tra, trình biên dịch sẽ kiểm tra xem chương trình của bạn có xử lý chúng hay không bằng cách đánh dấu chúng hoặc bằng cách chỉ định (với mệnh đề throws) là phương pháp mà ngoại lệ có thể xảy ra.

Loại ngoại lệ là các lớp con của java.lang.RuntimeException (và chính bản thân số RuntimeException) là các ngoại lệ không được kiểm soát. Đối với những trường hợp ngoại lệ, trình biên dịch không thực hiện kiểm tra - vì vậy bạn không bắt buộc phải bắt chúng hoặc chỉ định rằng bạn có thể ném chúng.

Lớp InterruptedException là ngoại lệ được kiểm tra, vì vậy bạn phải nắm bắt hoặc tuyên bố rằng phương pháp của bạn có thể ném nó. Bạn đang ném ngoại lệ từ khối catch, vì vậy bạn phải xác định rằng phương pháp của bạn có thể ném nó:

public void invalid() throws InterruptedException { 
    // ... 

lớp ngoại lệ mà mở rộng java.lang.Exception (trừ RuntimeException và lớp con) là trường hợp ngoại lệ kiểm tra.

Xem Sun Java Tutorial about exceptions để biết thông tin chi tiết.

+0

Có thể đáng nói đến là bạn cũng có thể ném các trường hợp của các lớp không ngoại lệ bắt nguồn từ Throwable. Đây là ngoại lệ nhưng không ngoại lệ :) –

+0

@Jon, vâng, nhưng đó là một chủ đề nâng cao vượt xa những gì mà người đăng yêu cầu, tôi không muốn làm cho một khóa học hoàn chỉnh về ngoại lệ trong Java ... – Jesper