对空结果集执行非法操作

elcex8rz  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(307)

这个问题在这里已经有答案了

java.sql.sqlexception:对空结果集执行非法操作。验证时(2个答案)
5个月前关门了。
我试图在一家杂货店建立一个支付台,我的代码实际上执行了我想要它做的事情,但有一点。
在我要求用户输入他们想要的商品数量之后,产品信息被收集起来,工作正常,但是当我要求用户输入下一个产品的产品id时,行被重复,我在catch中得到以下异常:“对空结果集的非法操作”。再说一遍,所有的计算和一切都很好,除了重复那条线。有什么问题吗?
重复的输出如下:
输入产品(或退出):
错误1:对空结果集执行非法操作。
输入产品(或退出):
这是密码。

try {
  Class.forName("com.mysql.jdbc.Driver");
  String connection = "jdbc:mysql://myDB?";
  connection = connection + "user=xxx&password=xxxxxx";
  Connection conn = DriverManager.getConnection(connection);
  // MATA IN PRODUKTNUMMER
  System.out.println("\nEnter product (or Exit):");
  GroceryStore.input = GroceryStore.scan.nextLine();

  PreparedStatement stmt = conn.prepareStatement(
          "SELECT * "+
          "FROM Products "+
          "WHERE productNo = ?");
          stmt.setString(1, GroceryStore.input); 

          ResultSet rs = stmt.executeQuery();
          rs.next();

    pName = rs.getString("productName");
    System.out.println("Product: " + pName);

    // MATA IN ANTAL
    System.out.println("\nEnter amount:");
    GroceryStore.amount = GroceryStore.scan.nextInt();

    pPrice = rs.getDouble("productPrice");
    priceRounded = new BigDecimal(pPrice).setScale(2, BigDecimal.ROUND_FLOOR);
    amountRounded = new BigDecimal(GroceryStore.amount).setScale(0);
    priceRounded = priceRounded.multiply(amountRounded);
    GroceryStore.sum = GroceryStore.sum.add(priceRounded);

    inOut.output();  
    inOut.input();
    conn.close();
    }
    catch (Exception e) {
         System.out.println("ERROR1: " + e.getMessage());
    }
cnwbcb6i

cnwbcb6i1#

在实际从结果集中检索值之前,尚未检查结果集是否为空。。。
next()返回true如果结果集中有数据,则返回false如果光标位置没有数据,则按如下方式放置代码

While(rs.next())
{
    pName = rs.getString("productName");
    System.out.println("Product: " + pName);

    // MATA IN ANTAL
    System.out.println("\nEnter amount:");
    GroceryStore.amount = GroceryStore.scan.nextInt();

    pPrice = rs.getDouble("productPrice");
}
pjngdqdw

pjngdqdw2#

您没有检查结果集中是否有任何数据或行。

ResultSet rs = stmt.executeQuery();
rs.next();
...
...

您应该检查结果是否为空或是否有任何行:

ResultSet rs = stmt.executeQuery();
if(rs.next()){
.....
your code
.....
}

相关问题