在JDBC上对空ResultSet抛出自定义异常



在尝试使用自定义异常时,我有一个布尔语句的问题。当使用我的代码来检查是否存在优惠券在数据库中,它返回true时,它存在。然而,当优惠券不存在,它抛出一个sql异常:"对空结果集的非法操作。"而不是我自定义的

My boolean Method:

@Override
public boolean isCouponExist(int couponID) throws SQLException {
Connection connection = pool.getConnection();
try {
PreparedStatement statement = connection.prepareStatement(CHECK_EXISTS);
statement.setInt(1, couponID);
ResultSet rs = statement.executeQuery();
return rs.next();
} finally {
pool.restoreConnection(connection);
}
}

获取优惠券的方法:

@Override
public Coupon getOneCoupon(int couponID) throws SQLException {
Connection connection = pool.getConnection();
Coupon result = null;
try {
PreparedStatement statement = connection.prepareStatement(GET_ONE_COUPON);
statement.setInt(1, couponID);
ResultSet resultSet = statement.executeQuery();
resultSet.next();
result = new Coupon(resultSet.getInt(1), resultSet.getInt(2), Category.categoryFor(resultSet.getInt(3)),
resultSet.getString(4), resultSet.getString(5), resultSet.getDate(6), resultSet.getDate(7),
resultSet.getInt(8), resultSet.getDouble(9), resultSet.getString(10));
} finally {
pool.restoreConnection(connection);
}
return result;
}

facade中用于验证的方法:

public void purchaseCoupon(Coupon coupon) throws CouponExceptions, SQLException {

if(!coup.isCouponExist(coupon.getId())) {
throw new CouponExceptions("ERROR: Coupon " + coupon.getId() + " does not exist.");
} 

}

运行代码:

CustomerFacade customer = (CustomerFacade) login.login("rotemb@gmail.com", "1378", ClientType.CUSTOMER);
Coupon p1 = coupDAO.getOneCoupon(55);
customer.purchaseCoupon(p1);

你可以看到,我给它一个不存在的ID号,以便得到一个异常。

异常堆栈:

Exception in thread "main" java.sql.SQLException: Illegal operation on empty result set.
at mysql.connector.java@8.0.18/com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129)
at mysql.connector.java@8.0.18/com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)
at mysql.connector.java@8.0.18/com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:89)
at mysql.connector.java@8.0.18/com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:63)
at mysql.connector.java@8.0.18/com.mysql.cj.jdbc.result.ResultSetImpl.checkRowPos(ResultSetImpl.java:484)
at mysql.connector.java@8.0.18/com.mysql.cj.jdbc.result.ResultSetImpl.getObject(ResultSetImpl.java:1283)
at mysql.connector.java@8.0.18/com.mysql.cj.jdbc.result.ResultSetImpl.getInt(ResultSetImpl.java:786)
at coupon.dbdao.CouponsDBDAO.getOneCoupon(CouponsDBDAO.java:155)
at coupon.Program.main(Program.java:49)

当试图给一个合法的优惠券ID我没有问题。当试图给一个非法优惠券ID,而不是我的自定义异常,我得到SQLException:"对空结果集的非法操作">

还是第一次。

您正在错误的地方寻找问题,它不是来自isCouponExist,而是来自getOneCoupon方法。

coupon.dbdao.CouponsDBDAO.getOneCoupon (CouponsDBDAO.java: 155)

问题是你在getOneCoupon中的代码没有考虑到记录可能不存在于数据库中。

通读代码后,getOneMethod中的问题是你没有考虑到

resultSet.next ();可能为false

应该是

if  (resultSet.next()) {
result = new Coupon(resultSet.getInt(1), resultSet.getInt(2), Category.categoryFor(resultSet.getInt(3)),
resultSet.getString(4), resultSet.getString(5), resultSet.getDate(6), resultSet.getDate(7),
resultSet.getInt(8), resultSet.getDouble(9), resultSet.getString(10));
}

关于抛出自定义异常的原始问题,您应该用SQLException的try catch子句包装您的代码。

在这种特殊情况下,你的代码应该考虑到没有结果的可能性。

相关内容

  • 没有找到相关文章

最新更新