我正在尝试处理结果集中的 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 methodwasNull
to see if the value read was SQLNULL
.
您的代码存在三个问题:
- 在检索值之前,您始终需要使用
rs.next()
检查是否存在行(如果存在则移至该行)。 - 您需要先检索一个值(例如
getInt(1)
),然后才能调用wasNull()
。 - 您使用
wasNull()
将0
分配给versionNo
,这是完全没有必要的,因为getInt
将返回0
如果列值为NULL
(请参阅getInt
: “返回:列值;如果值为 SQLNULL
,返回值为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/