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

标签 java jdbc resultset

我正在尝试处理结果集中的 null 并出现下面提到的错误

代码: 这里查询返回 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 将返回0 如果列值为 NULL(请参阅 getInt : “返回:列值;如果值为 SQL NULL ,返回值为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
        }
    }
}

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

另一方面,如果您想检查是否没有行,那么您应该执行以下操作:

选项 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);
    }
}

关于java - 使用 wasnull() 处理 java 结果集中的 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60052387/

相关文章:

java - 将 ArrayList 的内容与结果集进行比较

java - Android:如果 EditText 在 x 秒内未更改,则调用函数

java - 正确地表述常数的条件?

java - Oracle JDBC : underflow in double

java - hibernate :What makes JDBC connections expensive?

Java Mysql查询结果集错误

Java ResultSet 除了 sql 之外什么也没有得到 mysql 中的结果

java - hibernate HQL : pass pair values as parameters in IN clause

java - 保存 Android 应用程序状态

java - DB2 错误 SQLCODE=-103,SQLSTATE=42604