2012-04-17 43 views
5

Đoạn mã sau sử dụng mã Java đơn giản.Unknown NullPointerException trong Java

package pkg; 

final public class Main 
{ 
    final private class Demo 
    { 
     private Integer value = null; 

     public Integer getValue() 
     { 
      return value; 
     } 
    } 

    private Integer operations() 
    { 
     Demo demo = new Demo(); 
     return demo==null?new Integer(1):demo.getValue(); 
    } 

    public static void main(String[] args) 
    { 
     Main main=new Main(); 
     System.out.println("Value = " + String.valueOf(main.operations())); 
    } 
} 

Mã trên hoạt động như mong đợi không có vấn đề và hiển thị Value = null trên bảng điều khiển.

Trong tuyên bố return sau,

return demo==null?new Integer(1):demo.getValue(); 

kể từ khi đối tượng demo loại Demokhôngnull, khái niệm sau : đó là demo.getValue() được thực hiện mà gọi getValue() trong lớp bên Demo trả về null và cuối cùng, nó được chuyển thành Chuỗi và hiển thị trên bảng điều khiển.

Nhưng khi tôi thay đổi operations() phương pháp giống như một hiển thị dưới đây,

private Integer operations() 
{ 
    Demo demo = new Demo();  
    return demo==null?1:demo.getValue(); 
} 

nó ném NullPointerException. Làm sao?


Ý tôi là khi tôi sử dụng return tuyên bố này

return demo==null?new Integer(1):demo.getValue(); 

nó hoạt động (không ném NullPointerException)

và khi tôi sử dụng một cái gì đó tương tự như saureturn tuyên bố

return demo==null?1:demo.getValue(); 

nó gây ra NullPointerException. Tại sao?

+3

http://stackoverflow.com/questions/7811608/java-npe-in-ternary-operator-with-autoboxing –

+0

bản sao có thể có của [lạ Java NullPointerException với autoboxing] (http://stackoverflow.com/questions/ 3265948/strange-java-nullpointerexception-with-autoboxing) – Pops

Trả lời

11

Tuyên bố này:

return demo==null?1:demo.getValue(); 

đang thực sự được chuyển đổi thành một cái gì đó như thế này:

int tmp = demo == null ? 1 : demo.getValue().intValue(); 
return (Integer) tmp; 

Kiểu của biểu thức điều kiện được xác định là int (không Integer) dựa trên các quy tắc laid out in the JLS, section 15.25 , sử dụng binary numeric promotion (5.6.2). Chuyển đổi từ tham chiếu null thành int sau đó kích hoạt NullPointerException.

3
return demo==null?new Integer(1):demo.getValue(); 

Trong trường hợp này, loại biểu thức là Số nguyên và giá trị rỗng là giá trị pháp lý.

return demo==null?1:demo.getValue(); 

Trong trường hợp này loại biểu thức là int, vì vậy giá trị trả về số nguyên của bạn sẽ tự động được mở hộp. Và vì nó là null, nó ném một NPE.

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