2013-09-05 35 views
5

Tôi muốn hiểu lý do mã sau đây ném Ngoại lệ con trỏ không hợp lệ.Ưu tiên toán tử - Toán tử số học và điều kiện

import java.util.List; 

public class Test { 
    public static void main(String[] args) { 
     List<String> names = null; 
     System.out.println("Result is: " + names == null ? null : names.size()); 
    } 
} 
+0

Có thể bạn muốn đặt tên == null? '0': names.size() – dcaswell

Trả lời

10

Vấn đề là bản in của bạn được đánh giá là:

System.out.println(("Result is: " + names) == null ? null : names.size()); 

Điều này là do thực tế là + has more precedence than ?: operator Vì vậy, như chuỗi - "Kết quả là null" không bằng null, đánh giá names.size() ném NPE.

Lưu ý rằng, khi null được sử dụng trong chuỗi nối, nó sẽ tự động được chuyển đổi thành "null". Vì vậy, "Result is: " + null sẽ không ném NPE. Đây là theo JLS - String Conversion:

Nếu tham chiếu là null, nó được chuyển thành chuỗi "null" (bốn ký tự ASCII n, u, l, l).

Để khắc phục vấn đề này, bạn nên thêm ngoặc xung quanh biểu thức điều kiện của bạn để thực thi precendence hơn với nó:

System.out.println("Result is: " + (names == null ? null : names.size())); 
4

Sửa chữa câu trả lời Jigar, đây thực sự làm việc:

someString + null 

Để sửa mã OP của, chỉ cần thêm dấu ngoặc đơn - theo cách này các hoạt động sẽ được thực hiện theo đúng thứ tự và kết quả sẽ là như mong đợi:

System.out.println("Result is: " + (names == null ? null : names.size())); 
2

bạn đang viết "Kết quả là:" + tên mà không phải là tương đương với null để cố gắng in names.size(). Nhưng khi names.size() được gọi là nó ném ngoại lệ con trỏ null như tên vẫn còn null.

Sửa

System.out.println("Result is: " + names == null ? null : names.size()); 

để

System.out.print("Result is: "); 
System.out.println(names == null ? null : names.size()); 

sau đó bạn sẽ nhận được null như đầu ra.

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