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

Rav*_*ran 1 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);
                }
            }
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*eel 5

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

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

报告读取的最后一列的值是否为 SQL NULL。请注意,您必须首先在列上调用 getter 方法之一以尝试读取其值,然后调用该方法wasNull以查看读取的值是否为 SQL NULL

您的代码存在三个问题:

  1. rs.next()在检索值之前,您总是需要使用来检查是否有一行(如果存在,则移动到该行)。
  2. 您需要检索一个值(例如getInt(1)),然后才能调用wasNull()
  3. 您可以使用wasNull()分配0versionNo,这是完全不必要的,因为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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

选项 1:等效逻辑

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

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

try (ResultSet res = stmt.executeQuery(query)) {
    versionNo = 0;
    while (res.next()) {
        versionNo = res.getInt(1);
    }
}
Run Code Online (Sandbox Code Playgroud)