Tôi tình cờ thấy mã trông giống như thế này:
void run() {
try {
doSomething();
} catch (Exception ex) {
System.out.println("Error: " + ex);
throw ex;
}
}
void doSomething() {
throw new RuntimeException();
}
Mã này làm tôi ngạc nhiên vì có vẻ như run()
-method có khả năng ném Exception
, vì nó bắt Exception
và sau đó lấy lại, nhưng phương thức này không được tuyên bố là ném Exception
và dường như không cần phải như vậy. Mã này biên dịch tốt (ít nhất là trong Java 11).
Kỳ vọng của tôi sẽ là tôi sẽ phải tuyên bố throws Exception
trong run()
-method.
Thông tin bổ sung
Theo cách tương tự, nếu doSomething
được tuyên bố ném IOException
thì chỉ IOException
cần khai báo theo phương run()
pháp -method, ngay cả khi Exception
bị bắt và rút lại.
void run() throws IOException {
try {
doSomething();
} catch (Exception ex) {
System.out.println("Error: " + ex);
throw ex;
}
}
void doSomething() throws IOException {
// ... whatever code you may want ...
}
Câu hỏi
Java thường thích sự rõ ràng, lý do đằng sau hành vi này là gì? Có phải nó luôn như thế này? Điều gì trong Đặc tả ngôn ngữ Java cho phép run()
phương thức không cần khai báo throws Exception
trong đoạn mã ở trên? (Nếu tôi thêm nó, IntelliJ cảnh báo tôi rằng Exception
không bao giờ được ném).
-source 1.6
cờ làm tăng lỗi biên dịch như mong đợi. Biên soạn với nguồn tương thích 7 không không gây lỗi biên dịch
In detail, in Java SE 7 and later, when you declare one or more exception types in a catch clause, and rethrow the exception handled by this catch block, the compiler verifies that the type of the rethrown exception meets the following conditions : 1. 1. The try block is able to throw it. 2. There are no other preceding catch blocks that can handle it. 3. It is a subtype or supertype of one of the catch clause's exception parameters.
javac
- Tôi đã gặp phải trường hợp trình biên dịch Eclipse nhẹ nhàng hơn.