2012-02-28 77 views
16

Tôi khai báo biến Boolean. Ví dụ Boolean dataVal=null; Bây giờ nếu tôi thực hiện đoạn mã sau:Đối tượng Boolean và vấn đề biến boolean trong JAVA

if(dataVal) 
    System.out.println("\n\NULL value in dataVal: "+dataVal); 
else 
    System.out.println("\n\nvalue in dataVal: "+dataVal); 

tôi nhận được NullPointerException. Vâng, tôi biết rõ ràng của nó, nhưng tôi cần phải biết lý do đằng sau này.

+0

whats Lý do? Null của nó để nullpointerException rằng lý do –

+0

boolean = null; ? Đó là ngữ pháp Java không chính xác. Đúng? – Russell

+3

@Russell - 'Boolean' là một đối tượng, không phải là một nguyên thủy, ergo null có ý nghĩa. – mcfinnigan

Trả lời

25

Khi bạn đánh giá giá trị boolean của một đối tượng Boolean Java Unbox giá trị (tính năng autoboxing, kể từ 1.5). Vì vậy, mã thực sự là: dataVal.booleanValue(). Sau đó, nó ném NullPointerException. Với bất kỳ giá trị đóng hộp nào, việc unboxing một đối tượng null sẽ ném ngoại lệ này.

Trước 1,5 bạn phải Unbox giá trị bằng tay: if (dataVal.booleanValue()) vì vậy nó là rõ ràng hơn (tiết nhiều quá :)

14

dataVal đang được truyền tới boolean sử dụng Boolean.booleanValue() được dịch sang null.booleanValue() dẫn bạn đến NullPointerException.

0

if(null) không phải là biểu thức hợp lệ, đơn giản như vậy.

Dưới mũ trùm, VM đang sử dụng autoboxing ... để bạn có được một NullPointerException.

1

Boolean (lớp) = boolean (nguyên thủy loại)!.

Java cố gắng lấy giá trị nguyên thủy gọi dataVal.booleanValue(). Bởi vì dataVal là null, bạn nhận được một ngoại lệ con trỏ null.

4

Bạn có thể có một cái nhìn tại các đặc điểm kỹ thuật cho các vấn đề unboxing, tình hình của bạn được mô tả here phần 5.1.8 Unboxing chuyển đổi: Nếu r là null, chuyển đổi unboxing ném một NullPointerException

Điều đó có nghĩa nếu bạn (/ * Đối tượng Boolean * /) sẽ không bao giờ được unboxed thành một kiểu nguyên thủy boolean và do đó ném một NPE bởi vì bạn đang làm một không hợp lệ if(null).

Bằng cách này, unboxing sẽ làm việc nếu bạn có:

final Boolean booleanTest = new Boolean (true); 
if (booleanTest) { 
    // Do something 
} 
Các vấn đề liên quan