Tại sao Java không cho phép gán giá trị cho biến cuối cùng trong khối catch sau khi đặt giá trị trong khối thử, ngay cả khi nó không có thể cho giá trị cuối cùng được viết trong trường hợp ngoại lệ.Gán giá trị mặc định cho biến cuối cùng trong trường hợp ngoại lệ trong Java
Dưới đây là một ví dụ mà chứng tỏ vấn đề:
public class FooBar {
private final int foo;
private FooBar() {
try {
int x = bla();
foo = x; // In case of an exception this line is never reached
} catch (Exception ex) {
foo = 0; // But the compiler complains
// that foo might have been initialized
}
}
private int bla() { // You can use any of the lines below, neither works
// throw new RuntimeException();
return 0;
}
}
Vấn đề là không khó để làm việc xung quanh, nhưng tôi muốn hiểu lý do tại sao các trình biên dịch không chấp nhận điều này.
Cảm ơn trước về mọi thông tin đầu vào!
Vâng, nếu bạn đang nắm bắt được 'Ngoại lệ 'chung thì có thể có điều gì xảy ra ngay sau/trong khi' foo = x' có thể ném một ngoại lệ không? Có lẽ trình biên dịch là "chơi nó an toàn"? – FromCanada
Vâng đó là câu hỏi. Nhưng tôi thực sự nghi ngờ rằng một nhiệm vụ có thể dẫn đến một ngoại lệ bị ném và vẫn viết một giá trị cho biến đó. – Alfonso
Nơi bạn nói "Trong trường hợp ngoại lệ dòng này không bao giờ đạt được" Tôi nghi ngờ rằng trình biên dịch từ chối biết ý định của bạn đến mức độ chi tiết đó. Vì vậy, tất cả những gì nó thấy là foo được chỉ định hai lần. Có lẽ lý do là, điều này cho phép trình biên dịch tối ưu hóa mã xuống foo = bla(), vì x cuối cùng là thừa không? Chỉ cần suy đoán. – greim