6

Tôi đã đoạn mã sauThêm trở lại trong cuối cùng ẩn ngoại trừ

public static void nocatch() 
{ 
    try 
    { 
     throw new Exception(); 
    } 
    finally 
    { 

    } 
} 

Mà cho lỗi

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
Unhandled exception type CustomException 

Đó là như mong đợi, nhưng thêm một tuyên bố return trong khối finally làm cho các lỗi biến mất

public static void nocatch() 
{ 
    try 
    { 
     throw new Exception(); 
    } 
    finally 
    { 
     return; //makes the error go away! 
    } 
} 

Ai đó có thể vui lòng giải thích cho tôi đang xảy ra? và tại sao lỗi này biến mất?

Lưu ý: Tôi đã viết mã này hoàn toàn cho mục đích thử nghiệm!

+1

Bài liên quan: [thử cuối cùng khối thực thi] (http://stackoverflow.com/q/18131447/1679863). Mặc dù điều đó không nói về ngoại lệ, nhưng lý do cho điều này cũng giống như vậy. –

+1

Lưu ý phụ: không thử chạy mã không biên dịch. Thực sự không có lợi ích khi làm như vậy. Nói về lỗi biên dịch thời gian, thay vì ngoại lệ bạn nhận được từ mã đang chạy chưa được biên dịch để bắt đầu. –

+0

@JonSkeet Tôi chỉ muốn chỉ ra lỗi mà nó gây ra, đó là lý do tại sao tôi chạy mã. – codeMan

Trả lời

7

Lỗi biến mất vì mã của bạn hiện đang hợp lệ. (Không đẹp, nhưng hợp lệ.)

Nếu một khối finally chỉ có câu lệnh return; thẳng, thì câu lệnh tổng thể/nắm bắt/cuối cùng hoặc cố gắng/cuối cùng không thể ném bất kỳ ngoại lệ nào - vì vậy bạn không cần phải tuyên bố rằng có thể ném một ngoại lệ.

Trong mã ban đầu của bạn, khối try của bạn có thể (tốt, nó sẽ) ném Exception (hoặc CustomException trong mã thực sự của bạn, rõ ràng) - và đó là một ngoại lệ kiểm tra, có nghĩa là bạn phải hoặc là bắt nó hoặc kê khai rằng phương pháp có thể ném nó.

+0

Tôi tự hỏi nếu hành vi ngoại lệ giết chết của trả về trong khối 'cuối cùng' của Java là một tính năng cố ý cung cấp, hoặc nếu Gosling et al. chỉ đơn giản là không nghĩ rằng nó là giá trị nỗ lực để ngăn chặn? Tôi hy vọng nó sẽ là cựu, mặc dù nếu đó là trường hợp nó sẽ là tốt cho Gosling et al. đã ghi lại "yêu cầu không được yêu cầu" rằng khối 'cuối cùng 'chỉ có thể * hợp pháp * trả lại trong trường hợp mã biết rằng không có ngoại lệ nào có thể đang chờ xử lý (ví dụ: vì cờ được đặt làm thao tác cuối cùng trong' try' hoặc 'catch' block). – supercat

0

Theo javadoc ...

The finally block always executes when the try block exits. 
This ensures that the finally block is executed even if an unexpected exception occurs. 

Vì vậy, mã của bạn được làm việc đó một cách chính xác bây giờ.

+0

Bạn có thể thêm liên kết không? – DataDino

+1

@DataDino https://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html –

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