2010-10-28 30 views
8

thể Duplicates:
Booleans, conditional operators and autoboxing
Java, Google Collections Library; problem with AbstractIterator?Java tự động boxing/unboxing wierdness

Đoạn code dưới đây tạo ra một NPE:

Integer test = null; 
Integer test2 = true ? test : 0; 
System.out.println(test2); 

Để in một cách chính xác ra "null "không có ngoại lệ yêu cầu mã này:

Integer test = null; 
Integer test2 = true ? test : (Integer)0; 
System.out.println(test2); 

Rõ ràng trong ví dụ đầu tiên "kiểm tra" đang được mở hộp (chuyển thành int gốc), nhưng tại sao? Và tại sao thay đổi biểu thức khác trong toán tử bậc ba (như trong ví dụ thứ 2) sửa nó? Bất cứ ai có thể cung cấp một số loại câu chuyện về chính xác khi nào, những gì, và tại sao các công cụ trong cả hai ví dụ được đóng hộp và unboxed?

+0

Xem http://www.mail-archive.com/[email protected]/msg32723.html – Adam

+0

Hoặc [Java, Thư viện bộ sưu tập của Google; vấn đề với AbstractIterator? ] (http://stackoverflow.com/questions/1821510/java-google-collections-library-problem-with-abstractiterator), cụ thể là về 'int'. –

+0

Vẫn chưa có ai trả lời (ví dụ cụ thể này) thứ tự thời điểm và nội dung được đóng hộp và được tự động đóng hộp. – GreenieMeanie

Trả lời

18

Từ section 15.25 of the Java Language Specification:

Loại một biểu thức điều kiện được xác định như sau:

  • Nếu toán hạng thứ hai và thứ ba có cùng loại (trong đó có thể là loại null), sau đó đó là loại biểu thức có điều kiện.
    • Nếu một trong hai toán hạng thứ hai và thứ ba thuộc loại boolean và loại khác là kiểu Boolean, thì loại biểu thức điều kiện là boolean.
    • Nếu một trong hai toán hạng thứ hai và thứ ba là kiểu null và kiểu kia là kiểu tham chiếu, thì loại biểu thức có điều kiện là kiểu tham chiếu đó.
    • Nếu không, nếu toán hạng thứ hai và thứ ba có các loại có mui trần (§5.1.8) với các loại số, sau đó có một số trường hợp:
      • Nếu một trong các toán hạng có kiểu byte hoặc Byte và khác là loại ngắn hoặc ngắn, sau đó loại biểu thức điều kiện là ngắn.
      • Nếu một trong các toán hạng là loại T trong đó T là byte, ngắn hoặc char và toán hạng khác là biểu thức liên tục của kiểu int có giá trị đại diện trong loại T, thì loại biểu thức điều kiện là T
      • Nếu một trong các toán hạng thuộc loại Byte và toán hạng khác là biểu thức liên tục của kiểu int có giá trị đại diện trong byte loại, thì loại biểu thức điều kiện là byte.
      • Nếu một trong các toán hạng là loại Ngắn và toán hạng khác là một biểu thức liên tục của kiểu int có giá trị là biểu thị trong loại ngắn, thì loại biểu thức điều kiện là ngắn.
      • Nếu một trong các toán hạng thuộc loại; Ký tự và toán hạng khác là một biểu thức liên tục của kiểu int có giá trị là biểu diễn trong kiểu char, sau đó kiểu biểu thức điều kiện là char.
      • Nếu không, quảng bá số nhị phân (§5.6.2) được áp dụng cho các loại toán hạng và loại biểu thức có điều kiện là loại được thăng hạng của toán hạng thứ hai và thứ ba. Lưu ý rằng quảng cáo số nhị phân thực hiện chuyển đổi unboxing (§5.1.8) và chuyển đổi tập hợp giá trị (§5.1.13).

Vì vậy, nó sau khi viên đạn cuối cùng, thực hiện chương trình khuyến mãi số nhị phân, mà thực hiện một chuyển đổi unboxing. Vì vậy, loại biểu thức toán tử có điều kiện là int, ngay cả khi bạn gán nó cho một số Integer. Nó đang cố gắng thực hiện chuyển đổi unboxing trên null, do đó ngoại lệ.

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