使用 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
.
您的代码存在三个问题:
- 在检索值之前,您始终需要使用
rs.next()
检查是否有一行(如果存在则移动到该行)。
- 您需要检索一个值(例如
getInt(1)
),然后才能调用 wasNull()
。
- 您使用
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);
}
}
我正在尝试处理结果集中的空值,得到下面提到的错误
代码: 这里查询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 methodwasNull
to see if the value read was SQLNULL
.
您的代码存在三个问题:
- 在检索值之前,您始终需要使用
rs.next()
检查是否有一行(如果存在则移动到该行)。 - 您需要检索一个值(例如
getInt(1)
),然后才能调用wasNull()
。 - 您使用
wasNull()
将0
分配给versionNo
,这是完全没有必要的,因为getInt
将 return0
如果列值为NULL
(参见getInt
:"Returns: the column value; if the value is SQLNULL
, the value returned is0
")
要修复您的代码,您需要执行以下操作:
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);
}
}