2012-02-01 41 views
28

Tôi đang truy vấn một cơ sở dữ liệu và một số kết quả tôi nhận được là rỗng. Tôi đang thiết lập các giá trị này thành một biến với một kiểu dữ liệu gấp đôi. Hãy gọi biến "kết quả". Vì vậy, tôi đã cố gắng thiết lập một tuyên bố if để xem nó bằng Null mà tất nhiên không hoạt động. Đây là mã tôi đã cho rằng nếu tuyên bố:Làm thế nào để kiểm tra xem một đôi là null?

if (results == null) 
{ 
    results = 0; 
} 

Các lỗi tôi nhận được với mã này là:

Các toán tử == là undefined cho kiểu lập luận (s) đôi, null

Có cách nào tốt hơn để xác định nếu nó là null?

+1

Bạn cần lấy giá trị như một thứ thực sự có thể là 'null', 'Double'.Nguyên thủy không thể rỗng. –

Trả lời

26

Tôi khuyên bạn nên sử dụng Double chứ không phải gấp đôi làm loại của bạn, sau đó bạn kiểm tra lại null.

+9

Cảnh báo - chỉ cần khai báo 'kết quả' thành' Double' thay vì 'double' sẽ không khắc phục được sự cố. 'Double results = rs.getDouble();' sẽ ** không bao giờ gán một 'null' vào' kết quả'. –

+0

Tôi thấy câu trả lời này hữu ích cho trường hợp chung về việc theo dõi liệu giá trị kép đã được khởi tạo hay chưa. –

+2

Nhưng đó không phải là câu hỏi được hỏi. Và trong kịch bản mà OP hỏi, giải pháp này sẽ không hoạt động. –

6

Một nguyên thủy kép trong Java không bao giờ có thể rỗng. Nó sẽ được khởi tạo đến 0.0 nếu không có giá trị nào được đưa ra cho nó (trừ khi khai báo một biến đôi cục bộ và không gán một giá trị, nhưng điều này sẽ tạo ra một lỗi biên dịch thời gian).

Thông tin thêm về giá trị nguyên thủy mặc định here.

+2

Chúng sẽ chỉ được khởi tạo thành 0.0 nếu chúng là các biến mẫu. Nếu không họ không có giá trị, thậm chí không null. –

+0

(hoặc biến lớp) – Thilo

+1

Theo tài liệu, điều này chỉ xảy ra với các biến cục bộ và làm như vậy sẽ tạo ra lỗi biên dịch. Nếu bạn không thể biên dịch mã, nó không bao giờ được thực hiện, do đó, một đôi không bao giờ có thể rỗng hoặc không có giá trị trong thực thi. Tôi đã cập nhật bài đăng của mình. – onit

4

Để nói rằng cái gì đó "là null" có nghĩa là nó là tham chiếu đến giá trị null. Nguyên thủy (int, double, float, vv) được định nghĩa không phải là kiểu tham chiếu, vì vậy chúng không thể có giá trị null. Bạn sẽ cần phải tìm hiểu những gì cơ sở dữ liệu của bạn wrapper sẽ làm trong trường hợp này.

-1

Tôi tin rằng Double.NaN có thể bao gồm điều này. Đó là giá trị 'null' duy nhất có chứa.

+0

không có. Khái niệm khác nhau. –

4

Bạn nhận được giá trị của "kết quả" như thế nào? Bạn nhận được nó thông qua ResultSet.getDouble()? Trong trường hợp đó, bạn có thể kiểm tra ResultSet.wasNull().

44

Thứ nhất, một Java double không được rỗng và không thể so sánh với Java null. (Các loại double là một nguyên thủy (không tham khảo) gõ và các kiểu dữ liệu không thể được null.)

Tiếp theo, nếu bạn gọi ResultSet.getDouble(...), mà trả về một không double một Double, hành vi ghi nhận là một NULL (từ cơ sở dữ liệu) sẽ được trả về bằng không. (Xem javadoc liên kết ở trên.) Đó là không có sự giúp đỡ nếu số không là một giá trị hợp pháp cho cột đó.

Vì vậy, lựa chọn của bạn là:

  • sử dụng ResultSet.wasNull() để kiểm tra một (cơ sở dữ liệu) NULL ... ngay sau khi getDouble(...) cuộc gọi, hoặc

  • sử dụng ResultSet.getObject(...), và loại đúc kết quả để Double.

Phương pháp getObject sẽ cung cấp những giá trị như một Double (giả định rằng các loại cột là double), và được ghi chép lại để trở null cho một NULL. (Để biết thêm thông tin, this page lập bản đồ ánh xạ mặc định của các loại SQL thành các loại Java và do đó loại thực tế bạn mong đợi là getObject để phân phối.)

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