2012-11-08 17 views
12

Tôi luôn luôn nghĩ rằng loại nguyên thủy trong Java không thể null, vì nó là một lỗi thời gian biên dịch nếu tôi cố gắng làm một cái gì đó như thế này:tại sao tôi có thể thiết lập các kiểu dữ liệu để null trong hoạt động ternary

int test = null; 

Tuy nhiên trong một hoạt động ternary, có vẻ như được phép:

int test = something != 0 ? 5 : null; 

không phải là một hoạt động ternary chỉ viết tắt (trong trường hợp này):

int test; 
if (something != 0){ 
    test = 5; 
} else { 
    test = null 
} 

không được phép. nếu điều kiện đó không thành công, nó sẽ tự động ném một NullPointerException do autoboxing. Vậy tại sao trình biên dịch java không lấy được những điều vô nghĩa như thế này?

+1

Nhân tiện, bạn đang nói về các loại * nguyên thủy *. Các loại thô là một thứ hoàn toàn khác. http://docs.oracle.com/javase/tutorial/java/generics/rawTypes.html – Natix

+0

bạn đúng! Tôi chỉ nhầm lẫn chúng, và thay đổi nó cho phù hợp –

+0

có thể trùng lặp của [Toán tử ternary trong Java - autoboxing] (http://stackoverflow.com/questions/8098953/tricky-ternary-operator-in-java-autoboxing) –

Trả lời

12

Điều xảy ra là trình biên dịch Java đầu tiên cố gắng thực hiện các loại biểu thức ở hai bên của : bằng nhau. Trong trường hợp này, hộp này sẽ tự động chuyển số 5 thành Integer; lưu ý rằng null là giá trị hợp lệ cho Integer. Kết quả của toàn bộ biểu thức bậc ba là Integer. Bạn chỉ định điều đó cho một số int, do đó, Integer sau đó được tự động phát.

Về cơ bản trình biên dịch áp dụng autoboxing và -unboxing để cho đường thẳng sẽ trông như thế này:

int test = (something != 0 ? Integer.valueOf(5) : null).intValue(); 

Thật vậy, autounboxing null dẫn đến một NullPointerException.

Vậy tại sao trình biên dịch java không tìm nạp những điều vô nghĩa như thế này?

Bởi vì các nhà thiết kế của ngôn ngữ Java định nghĩa ngôn ngữ trong một cách mà nó hoạt động như thế này và không quyết định rằng điều này phải được coi là một lỗi ...

Section 15.25 của Java Đặc tả ngôn ngữ giải thích cách xác định loại toàn bộ biểu thức.

+0

@nhahtdh Tại sao bạn nghĩ vậy? – Jesper

+0

Xin lỗi, đừng bận tâm. Bạn đúng rồi. Đó là sự nhầm lẫn về phía tôi khi đọc mã tháo rời. – nhahtdh