如何检查一个double是否为空?

52

我正在查询一个数据库,其中一些结果是null。我正在将这些值设置为双精度数据类型的变量。让我们称这个变量为“results”。因此,我尝试设置一个if语句来查看它是否等于Null,但这当然不起作用。以下是我为该if语句编写的代码:

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

使用这段代码时我遇到的错误是:

The operator == is undefined for the argument type(s) double, null

有没有更好的方法来确定它是否为空?


2
你需要将值检索为实际可以为null的类型,例如Double。原始数据类型不能为null。 - Dave Newton
6个回答

57
首先,Java的double类型不能为Java的null,并且不能与null进行比较。(double类型是一种基本(非引用)类型,基本类型不能为null。)因此,我假设以下内容:
  • 您试图检测的 "null" 是存储在您查询的数据库中的NULL。
  • 您正在使用JDBC查询数据库。
如果调用ResultSet.getDouble(...),它会返回一个double而不是Double,文档记录的行为是从数据库返回NULL将被作为零返回。(请参见上面链接的javadoc。)如果零是该列的合法值,则这没有帮助。
result的声明类型从double更改为Double并不会有所帮助,正如Toby's answer所建议的。当数据库包含NULL时,赋给result的值将是Double(0.0),而不是null
以下是两个可行的选项:

getObject方法将返回一个Double值(假设列类型为double),并且文档中指出如果该值为NULL,则返回null。(更多信息请参见此页面,该页面记录了SQL类型与Java类型的默认映射,因此您应该期望getObject返回哪种实际类型。)


49

我建议使用 Double 而不是 double 作为你的类型,然后再检查是否为空。


14
警告 - 仅仅将results声明为Double而不是double并不能解决这个问题。Double results = rs.getDouble();永远不会null赋值给results - Stephen C
我认为这个答案对于跟踪double值是否已初始化的一般情况非常有用。 - Tim Biegeleisen
3
但那不是被问到的问题。在OP提出的情境中,这个解决方案根本行不通。 - Stephen C

8

Java中的双精度原始类型不能为null。如果没有为其赋值,则会被初始化为0.0(除非声明局部双精度变量且未分配值,但这将产生编译时错误)。

有关默认原始值的更多信息请在此处查看


2
如果它们是实例变量,它们将仅被初始化为0.0。否则,它们没有值,甚至不是null。 - Michael McGowan
1
根据文档,这只会发生在本地变量中,这样做会产生编译时错误。如果您无法编译代码,则永远不会执行,因此在执行中双倍数永远不可能为null或没有值。无论如何,我已经更新了我的帖子。 - onit
“否则它们没有任何值,甚至不是null。” - 严格来说,它们没有由JLS指定的值,也不能使用Java代码观察到。但是,如果你跳过足够多的障碍(并打破一个理智的程序员梦想都不敢打破的抽象边界),就会有一种方法可以观察到未初始化的本地变量包含的位模式。(提示:本地代码)。你可以认为这个位模式是一个值。 - Stephen C

6

当说某物“为空”时,意味着它是一个指向空值的引用。原始类型(int、double、float等)根据定义不是引用类型,因此它们不能有空值。在这种情况下,您需要找出您的数据库包装器将执行何种操作。


3
您是如何获取“results”的值的?您是通过ResultSet.getDouble()获取它的吗?如果是这样,您可以检查ResultSet.wasNull()。请参考ResultSet.wasNull()

-1

我相信 Double.NaN 可以解决这个问题。这是 double 类型唯一包含的“null”值。


这与此场景无关。 - Stephen C

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接