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?
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