使用 wasnull() 处理 java 结果集中的 null

Handling null in java Resultset using wasnull()

我正在尝试处理结果集中的空值,得到下面提到的错误

代码: 这里查询returns null,如果是null versionNo应该是0

int versionNo = 0;
        try {
            ResultSet res = stmt.executeQuery(query);
            if (res.wasNull()) {
                versionNo = 0;
            } else {
                while (res.next()) {
                    versionNo = res.getInt(1);
                }
            }

错误: java.lang.NullPointerException 在 com.mysql.cj.jdbc.result.ResultSetImpl.wasNull(ResultSetImpl.java:2496)

在这种情况下,MySQL Connector/J 驱动程序不应抛出 NullPointerException,而应该抛出 SQLException 结果集不在一行中.这是一个错误。

然而,wasNull() 方法用于检查从结果集中读取的最后一个 原始值 值是否为 null(因为原始值不支持null,而数据库列会):

Reports whether the last column read had a value of SQL NULL. Note that you must first call one of the getter methods on a column to try to read its value and then call the method wasNull to see if the value read was SQL NULL.

您的代码存在三个问题:

  1. 在检索值之前,您始终需要使用 rs.next() 检查是否有一行(如果存在则移动到该行)。
  2. 您需要检索一个值(例如 getInt(1)),然后才能调用 wasNull()
  3. 您使用 wasNull()0 分配给 versionNo,这是完全没有必要的,因为 getInt 将 return 0 如果列值为 NULL(参见 getInt"Returns: the column value; if the value is SQL NULL, the value returned is 0"

要修复您的代码,您需要执行以下操作:

try (ResultSet res = stmt.executeQuery(query)) {
    while (res.next()) {
        versionNo = res.getInt(1);
        if (res.wasNull()) {
            // whatever you want to, other than setting versionNo to 0
        }
    }
}

请注意,如果有多行,这将有效地 return 最后一行的值。

另一方面,如果你想检查是否没有行,那么你应该这样做:

选项 1:等效逻辑

try (ResultSet res = stmt.executeQuery(query)) {
    if (res.next()) {
       do {
           versionNo = res.getInt(1);
       } while (res.next());
    } else {
        // no rows
    }
}

选项 2:将 versionNo 初始化为默认值。如果您只对将 versionNo 初始化为零感兴趣,您也可以在处理行之前执行此操作。

try (ResultSet res = stmt.executeQuery(query)) {
    versionNo = 0;
    while (res.next()) {
        versionNo = res.getInt(1);
    }
}