2015-10-27 16 views
6

Trong quá trình học tập của tôi với OCPJP8, tôi đã gặp phải một câu hỏi không có câu trả lời rõ ràng cho tôi. Hãy xem xét mã sau:Vứt bỏ ngoại lệ thời gian chạy trong Closable.close()

public class Animals 
{ 
class Lamb implements Closeable 
{ 
    public void close() 
    { 
     throw new RuntimeException("a"); 
    } 
} 

public static void main(String[] args) 
{ 
    new Animals().run(); 
} 

public void run() 
{ 
    try (Lamb l = new Lamb();) 
    { 
     throw new IOException(); 
    } 
    catch (Exception e) 
    { 
     throw new RuntimeException("c"); 
    } 
} 
} 

Theo câu trả lời đúng cho câu hỏi "Ngoại lệ sẽ ném mã?" là "Thời gian chạy ngoại lệ c không có ngoại lệ bị loại bỏ". Tôi đã kiểm tra mã này trong Eclipse và system.out đề nghị rằng cuốn sách là đúng. Tuy nhiên, tôi cũng đã sửa đổi mã một chút và thêm System.out sau ngay trước khi ném RuntimeException "c"

System.out.println(e.getSuppressed().toString()); 

và đầu ra tôi đã nhận được từ System.out này là:

[Ljava.lang.Throwable; @ 75da931b

Vì vậy, rõ ràng là có một ngoại lệ bị loại bỏ. Trong chế độ gỡ lỗi, tôi cũng phát hiện ra rằng ngoại lệ bị loại bỏ này là một ngoại lệ trong phương thức close().

Hai câu hỏi: 1. Tại sao không có thông tin trong bảng điều khiển về ngoại lệ được ném trong phương thức close()? 2. Câu trả lời của cuốn sách có đúng không?

+0

Là một lưu ý phụ, sử dụng 'System.out.println (Arrays.toString (e.getSuppressed()));' để có được đầu ra có ý nghĩa hơn… – Holger

Trả lời

3

Ngoại lệ ức chế (RuntimeException -A) đã được thêm vào IOException bắt trong catch và mất từ ​​stack trace bản in như nó đã không được thông qua như là cause của RuntimeException -C.

Vì vậy, khi RuntimeException -C được in từ main, nó không đề cập đến số IOException hoặc bị chặn RuntimeException-A.

Và vì thế câu trả lời của cuốn sách là đúng vì ngoại lệ duy nhất được truyền từ phương pháp mainRuntimeException C mà không cause (IOException), và không có bất kỳ ngoại lệ ức chế (như nó đã được trên IOException).

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