Lý do phiên bản gốc không biên dịch là quy tắc "xác định rõ ràng" của JLS trong JLS section 16 nói rằng o
chưa được gán rõ ràng. Trình biên dịch báo cáo điều này với một thông điệp bí ẩn nói rằng "o
có thể chưa được khởi tạo".
Bây giờ, bất kỳ ai có kỹ năng suy luận đơn giản đều có thể thấy rằng điều kiện thứ 2 if
là phủ định của điều kiện if
đầu tiên và do đó biến trên thực tế luôn được khởi tạo. Tuy nhiên, JLS không cho phép trình biên dịch thực hiện việc khấu trừ đó. JLS cho biết đây là lỗi ...
Có một số cách để khắc phục sự cố này. Ví dụ:
- Gán điều gì đó cho
o
trong tuyên bố.
- Thay thế hai câu lệnh
if
bằng một tuyên bố if
/else
duy nhất.
- Khai báo
value
là final
.
Sửa chữa cuối cùng là thú vị.Lý do nó hoạt động là các quy tắc gán xác định JLS yêu cầu trình biên dịch để lấy giá trị của biểu thức boolean hằng số có giá trị biên dịch vào tài khoản.
Tuyên bố này (với final
thêm)
final int value = 9;
nghĩa là value
là một hằng số thời gian biên dịch. Điều đó có nghĩa là value <= 9
và value > 9
cũng là hằng số biên dịch. Do đó, JLS quy tắc phân định rõ rằng o
chắc chắn giao sau
if(value <= 9) o = 8;
và có thể được sử dụng sau này mà không có một lỗi biên dịch.
Các quy tắc phân công rõ ràng được thiết kế để ngăn chặn việc sử dụng các biến chưa được khởi tạo, và ngăn chặn trống final
biến được khởi tạo nhiều hơn một lần.
Việc xử lý thận trọng các giá trị biểu thức của JLS trong các quy tắc gán cố định được thiết kế để tránh các vấn đề trong đó trình biên dịch Java suy ra rằng một cái gì đó chắc chắn được gán. Subcase của các biểu thức biên dịch-thời gian-hằng số có thể được xử lý bằng cách đơn giản đánh giá biểu thức, và các quy tắc JLS ngầm nhận ra điều này.
Nguồn
2012-10-17 15:22:17
Lỗi là: biến o có thể chưa được khởi tạo (System.out.println (o)) –
Tại sao có hai câu lệnh if thay vì if..else? – CBredlow
Tôi chỉ khám phá langue. Không có lý do đặc biệt nào cho hai câu lệnh if. – uml