2009-06-10 28 views
22

Tôi không thể tìm thấy phần có liên quan của spec để trả lời câu hỏi này. Trong câu lệnh toán tử điều kiện trong Java, cả hai đối số đúng và sai đều được đánh giá?Java ternary (ngay lập tức nếu) đánh giá

Vì vậy, có thể sau ném một NullPointerException

Integer test = null; 

test != null ? test.intValue() : 0; 
+3

Cũng đơn giản là bạn chỉ có thể thử và xem điều gì xảy ra :) –

+7

Cung cấp cho bạn thông tin về một trường hợp cụ thể. Tốt hơn để tìm những gì tiêu chuẩn nói. –

Trả lời

43

Vì bạn muốn spec, ở đây nó là (từ §15.25 Conditional Operator ? :, câu cuối cùng của phần này):

The operand expression not chosen is not evaluated for that particular evaluation of the conditional expression.

8

Không, nó không thể. Đó là giống như:

Integer test = null; 
if (test != null) { 
    test = test.intValue(); 
} 
else { 
    test = 0; 
} 
0

cú pháp là sai.

Kiểm tra số nguyên = (test! = Null)? test.intValue(): 0;

hy vọng nó sẽ giúp ....

+1

Khai báo và tham chiếu biến trên cùng một dòng? * "Lỗi: biến' test' có thể chưa được khởi tạo "* – Pang

7

Tôi biết nó là bài cũ, nhưng nhìn vào trường hợp rất giống nhau và sau đó bỏ phiếu cho tôi: P

Trả lời câu hỏi ban đầu: chỉ có một toán hạng được đánh giá NHƯNG:

@Test 
public void test() 
{ 
    Integer A = null; 
    Integer B = null; 

    Integer chosenInteger = A != null ? A.intValue() : B;  
} 

Thử nghiệm này sẽ ném NullPointerException và trong trường hợp này IF statemat không tương đương với toán tử?:.

Lý do là ở đây http://docs.oracle.com/javase/specs/jls/se5.0/html/expressions.html#15.25. Phần về boxing/unboxing được lôi kéo, nhưng nó có thể được dễ dàng hiểu nhìn:

"If one of the second and third operands is of type boolean and the type of the other is of type Boolean , then the type of the conditional expression is boolean ."

cũng áp dụng như Integer.intValue()

Trân trọng!

+2

Điểm thú vị, cảm ơn Michal. Bởi vì A.intValue() thuộc loại int, tham chiếu đến B phải được tự động unboxed. Nhưng nó là không, vì vậy nó ném NPE. Trong Java 8/Eclipse Luna với phân tích null được bật, thử nghiệm này thậm chí không biên dịch! –

Các vấn đề liên quan