检查来自数据库的int变量是否为空或为空。

10

我有一个变量:

nocustomers = rs.getInt("CUST_TRAN_COUNT");

我想判断它是否为null。

我尝试过

if (nocustomers ==null)

它显示了一个错误。

我该怎么解决?


我的新修改代码是:

try{

    query=" select * from SS_summary where txn_date = to_date ('"+asatdate+"','YYYY-MM-DD') ";
    st = conn.createStatement();
    rs = st.executeQuery(query);

    if (rs.next())
    {   


    nocustomers = rs.getInt("CUST_TRAN_COUNT");

    nocheques =rs.getInt("CHEQ_DELIVERED_MAIN");
    }

    if (rs.wasNull()) {
        out.println("NO DATA FOUND");
        }

%>

你不能检查原始数据类型是否为null(= null指针),只能检查对象的指针。rs是什么?你必须检查你的ORM / SQL适配器是否具有这样的功能。 - Marian Theisen
这个变量的数据类型是什么,出现了什么错误? - Shahzeb
相关链接:https://dev59.com/vHE95IYBdhLWcg3wkeuq - Joachim Sauer
@maas,你不需要执行rs.wasNull(),因为rs.getInt()默认情况下如果数据为空将返回0。相反,可以这样写:if (nocustomers == 0) { out.println("NO DATA FOUND"); } - Buhake Sindi
因为看那个示例代码,我快得了癌症:( - topr
5个回答

7

int无法为null,因为它是原始类型。

出于相同的原因,ResultSet.getInt() 无法返回null

您需要在调用getInt()后立即调用ResultSet.wasNull()来检查该值是否为null

请注意,由于int无法为null,即使数据库值为nullnocustomer也将具有一个值。当DB值为null时, getInt()被定义为返回0,因此nocustomers将是 0


resultSet.wasNull() 没有起作用,并显示错误 "java.sql.SQLException: 未读取到数据"。 - maas
1
@maas:你什么时候调用的?在调用wasNull()之前,必须先调用getInt()。请展示你的代码。 - Joachim Sauer
如果(rs.next()) { nocustomers = rs.getInt(“CUST_TRAN_COUNT”); }如果(rs.wasNull()){ out.println(“未找到数据”); } - maas

3

在编译时,Java编译器会报以下错误信息:

incomparable types: int and <nulltype>
if (nocustomers  == null) {
      ^

那是因为你永远无法对原始类型进行空检查。如果未分配,原始类型将被赋予默认值(例如整数为零)。如果您想知道读取的值是否为空,请改用 ResultSet.wasNull() 方法(在读取整数值之后),请参见提供的 JavaDoc 链接。
nocustomers = rs.getInt("CUST_TRAN_COUNT");
if (rs.wasNull()) {
    nocustomers = -1; //Assuming, -1 means NULL.
}

如果wasNull()返回true,那么将0赋值给nocustomers是多余的,因为在这种情况下getInt()已经返回了0 - Joachim Sauer
@Joachim Sauer,确实如此。除非OP想将-1定义为null,否则OP不必担心检查null。我将我的赋值值从0更改为-1,以便在使用ResultSet.wasNull()的示例中使用。 - Buhake Sindi
如果 (rs.next()) { nocustomers = rs.getInt("CUST_TRAN_COUNT"); } 如果 (rs.wasNull()) { out.println("未找到数据"); } 它显示了一个错误。 - maas
1
@maas:请发布您的完整代码和完整堆栈跟踪(编辑问题或发布新问题)。 - Joachim Sauer

2
如果值为NULL,那么getInt将返回0,然后您可以调用wasNull来检查它是否保存了0或者是否为NULL
另请参阅:wasNull()

它显示了一个错误:“java.sql.SQLException:未读取任何数据” - maas
@maas:确保你在调用它之前只调用了getInt - Eran Zimmerman Gonen
resultSet.wasNull() 没有起作用,并显示错误 "java.sql.SQLException: 未读取到数据"。 - maas

1

你可以使用,

object obj = rs.getObject("CUST_TRAN_COUNT");
if (obj != null)
{
rs.getInt("CUST_TRAN_COUNT");
}

但在某些情况下(非常罕见),一旦您调用了getObject,就无法调用getInt,在这种情况下,您可以简单地使用

int.parse(obj.toString())

另外,我认为更好的方法是:

  int value = rs.getInt("CUST_TRAN_COUNT");
  boolean nullValue = rs.wasNull();

所以如果数据库返回 null,value 将为 0,但 nullValue 将为 true,以便您可以执行必要的操作。


1
那些“罕见”的情况是什么? - Jus12
问题发生在某个版本的mysql驱动程序中,当我调用getObject时,同一列的getInt会抛出异常。 - Low Flying Pelican

0

在您的ResultSetRowSet上有一个wasNull方法:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接