2012-04-15 30 views
11

Cả hai toán tử có điều kiện & & và || được đoản mạch theo
http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op2.html, có nghĩa là toán hạng thứ hai không cần phải được đánh giá vào các thời điểm.hành vi ngắn mạch của toán tử OR có điều kiện (||)

Ai đó có thể vui lòng cung cấp ví dụ trong đó toán tử điều kiện OR (||) sẽ bị đoản mạch?

hành vi ngắn mạch là khá đơn giản với các nhà điều hành có điều kiện-AND (& &) như trong:

if (sai & & (1> 0)) sau đó các toán hạng thứ hai: (1> 0) sẽ không cần phải được đánh giá nhưng dường như không thể tìm/nghĩ ra một ví dụ cho điều kiện HOẶC.

+1

Ngắn mạch sẽ xảy ra khi kết quả của toán hạng đầu tiên có thể xác định kết quả của phép toán logic. Đối với '&&' cái đầu tiên trở thành 'false' sẽ làm cho kết quả' false' chắc chắn và cho '||' cái đầu tiên trở thành true sẽ làm cho kết quả là 'true' chắc chắn. Vì vậy, toán hạng đầu tiên là 'true' sẽ ngắn mạch luôn luôn cho toán tử' || '. –

+1

Tại sao nó đơn giản hơn với ||? Nó chính xác đơn giản như với &&. Việc tính toán các biểu thức được dừng lại khi giá trị của toàn bộ điều kiện được biết. Biểu thức được đánh giá từ trái sang phải. –

+0

@ MichaelSchmeißer: xin lỗi không biết làm thế nào tôi bỏ lỡ nó đơn giản. – Vivek

Trả lời

1
if(true || (0 > 1)) 

Câu lệnh đầu tiên là đúng và do đó không cần đánh giá thứ hai.

15

Toán tử hoặc đoạn giới thiệu ngắn khi toán hạng đầu tiên là đúng. Vì vậy,

String foo = null; 
if (true || foo.equals("")) { 
    // ... 
} 

không ném NullPointerException.

Khi @prajeesh đúng chỉ ra trong các nhận xét, trên đường dây ngắn mạch được sử dụng trong mã thực là để ngăn chặn một NullPointerException bất cứ khi nào bạn đang xử lý một API có thể trả về null. Vì vậy, ví dụ, nếu có một phương pháp readStringFromConsole trả về một trong hai chuỗi hiện có hoặc null nếu người dùng không gõ bất cứ điều gì, chúng ta có thể viết

String username = readStringFromConsole(); 
while (username == null || username.length() == 0) { 
    // No NullPointerException on the while clause because the length() call 
    // will only be made if username is not null 

    System.out.println("Please enter a non-blank name"); 
    username = readStringFromConsole(); 
} 

// Now do something useful with username, which is non-null and of nonzero length 

Là một mặt lưu ý, một API trả về đầu vào người sử dụng nên trả lại chuỗi rỗng bất cứ khi nào người dùng không nhập bất kỳ thứ gì và không được trả về null. Trả về null là một cách để nói "không có gì có sẵn", trong khi trả về chuỗi rỗng là một cách để nói "người dùng không gõ bất cứ điều gì" và vì vậy được ưa thích.

+1

Tôi đã không nhận được một tình huống mà cụ thể này 'true || foo.equals ("") 'làm cho mọi thứ trông hợp lý một cách hợp lý, nó phải là' if (foo == null || foo.equals ("")) 'sẽ ngắn gọn khi' foo' là null và do đó ngăn chặn NPE . –

1
if (true || comparison) 

so sánh sẽ không bao giờ được đánh giá, vì kết quả của nó không liên quan (vì đối số đầu tiên đã đúng).

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