在尝试使用自定义异常时,我有一个布尔语句的问题。当使用我的代码来检查是否存在优惠券在数据库中,它返回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子句包装您的代码。
在这种特殊情况下,你的代码应该考虑到没有结果的可能性。