Gần đây tôi đã cố gắng chạy hai đoạn mã sau và đã rất ngạc nhiên khi xuất.Tính năng unboxing hoạt động như thế nào trong các biểu thức boolean ngắn mạch?
Đầu tiên:
// ...
System.out.println((Boolean)null || true);
// ...
Thứ hai:
// ...
System.out.println((Boolean)null || false);
// ...
Ví dụ kết quả đầu tiên trong kết quả sau:
đúng
Kết quả ví dụ thứ hai ở đầu ra sau đây:
Ngoại lệ trong chủ đề "chính" jav a.lang.NullPointerException
tại com.blah.main (SanityCheck.java:26)
tôi sẽ có suy nghĩ cả hai ví dụ nên kết quả trong một con trỏ ngoại lệ null, như bất kỳ ngắn mạch được áp dụng trái bên phải. Nỗ lực để unbox boolean từ Boolean nên đã thất bại trước mặt bên kia của lôgíc hoặc được xem xét.
Bất cứ ai có thể giải thích hành vi không nhất quán này?
Hành vi này có vẻ không phù hợp với [JLS] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.24) "Vào thời gian chạy, bên trái Biểu thức toán hạng được đánh giá đầu tiên, nếu kết quả có kiểu Boolean, nó phải chuyển đổi unboxing " –
SanityCheck.java – arynaq