2010-01-08 44 views
26

Giả sử tôi có các biểu hiện sauThứ tự biểu hiện Boolean của đánh giá trong Java?

Eclipse cảnh báo tôi rằng myString có thể là null trong cụm từ thứ hai của biểu thức boolean. Tuy nhiên, tôi biết một số rằng một số trình biên dịch sẽ thoát khỏi biểu thức boolean hoàn toàn nếu điều kiện đầu tiên không thành công. Điều này có đúng với Java không? Hoặc là thứ tự đánh giá không được bảo đảm?

+0

Bạn đang sử dụng trình biên dịch hoặc công cụ nào? – notnoop

+0

Tại sao nó lại quan trọng? – danben

+0

Vâng, javac (trình biên dịch phổ biến nhất) không cảnh báo về nullness. Nếu "Java cảnh báo tôi rằng myString có thể là null", rất có thể đó là một công cụ lỗi. Không có điều như "cảnh báo java". – notnoop

Trả lời

44

Tuy nhiên, tôi biết một số trình biên dịch sẽ thoát khỏi biểu thức boolean hoàn toàn nếu điều kiện đầu tiên không thành công. Điều này có đúng với Java không?

Vâng, đó được gọi là Short-Circuit evaluation .Operators như &&|| là nhà khai thác có hiệu suất hoạt động đó.

Hoặc thứ tự đánh giá không được đảm bảo?

Không, tự đánh giá được đảm bảo (từ trái sang phải)

1

Có, thực hành Java đánh giá lười biếng nếu các câu lệnh theo cách này. nếu myString == null, phần còn lại của câu lệnh if sẽ không được đánh giá

7

Java nên đánh giá các câu lệnh của bạn từ trái sang phải. Nó sử dụng một cơ chế được gọi là short-circuit evaluation để ngăn chặn các điều kiện thứ hai, thứ ba và thứ n được kiểm tra nếu điều kiện đầu tiên là sai.

Vì vậy, nếu cụm từ của bạn là myContainer != null && myContainer.Contains(myObject)myContainer là không, điều kiện thứ hai, myContainer.Contains(myObject) sẽ không được đánh giá.

Chỉnh sửa: Là một người khác được đề cập, Java nói riêng không có cả nhà khai thác ngắn mạch và không ngắn mạch cho các điều kiện boolean. Sử dụng && sẽ kích hoạt đánh giá ngắn mạch, và & sẽ không.

+1

Trích dẫn: 'Để ngăn chặn các điều kiện thứ hai, thứ ba và thứ n được kiểm tra nếu điều kiện đầu tiên là sai'. Trên thực tế, nếu toán tử là '||' trình biên dịch không thể kết thúc giá trị tổng thể từ lần đầu tiên nếu đầu tiên là sai. – H2ONaCl

2

James và Ed là chính xác. Nếu bạn gặp một trường hợp mà bạn muốn tất cả các biểu thức được đánh giá bất kể các điều kiện thất bại trước đó, bạn có thể sử dụng toán tử boolean không mạch ngắn &.

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