Vài ngày trước, tôi đã gặp một kịch bản hấp dẫn mà tôi không thể tìm thấy bất kỳ tài liệu nào về cách thức hoặc lý do Java cho phép điều sau xảy ra. (Đoạn mã này chỉ là một hình thức đơn giản của lỗi.)
@Test
public void test() {
boolean bool = false;
Integer intVal = Integer.valueOf(5);
Long longVal = null;
Long result = bool ? intVal : longVal;
System.out.println(" > " + result);
}
trong đoạn trích trên:
nếu bool = true, thì bạn nhận được giá trị '5';
nhưng nếu bool = false, thì bạn sẽ có một ngoại lệ con trỏ null khi cố gắng đánh giá hoạt động ternary. KHÔNG phải là tuyên bố in.
Để sửa lỗi này, tôi chỉ cần thay đổi 'kết quả' thành
Long result = bool ? Long.valueOf(intVal) : longVal;
Làm điều này, sẽ đưa ra hành vi dự kiến tôi cần:
nếu bool = true, thì bạn nhận được giá trị '5';
nhưng nếu bool = false, thì bạn nhận được 'null'
Bây giờ phần thú vị là nếu bạn chia nó thành một câu lệnh if / other bình thường, thì java KHÔNG cho phép bạn biên dịch
longVal = intVal;
nhưng nó không nắm bắt được điều đó thông qua toán tử ternary. Vậy Java đang làm gì để biến nó thành điểm không trong đoạn trích gốc?
(java 11)