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
MySQL Connector/J 驱动程序NullPointerException在这种情况下不应该抛出 a SQLException,而是应该抛出结果集不在一行上。这是一个错误。
但是,该wasNull()方法用于检查从结果集中读取的最后一个原始值是否为null(因为原始数据不支持null,而数据库列支持):
报告读取的最后一列的值是否为 SQL
NULL。请注意,您必须首先在列上调用 getter 方法之一以尝试读取其值,然后调用该方法wasNull以查看读取的值是否为 SQLNULL。
您的代码存在三个问题:
rs.next()在检索值之前,您总是需要使用来检查是否有一行(如果存在,则移动到该行)。getInt(1)),然后才能调用wasNull()。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
}
}
}
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)
| 归档时间: |
|
| 查看次数: |
1075 次 |
| 最近记录: |