捕获错误的异常

时间:2014-02-20 10:17:20

标签: java mysql exception exception-handling error-handling

我正在尝试使用MySQL中的Java来捕获特定异常。但是,它正在运行catch (SQLException ex)而不是我想要的那个。

catch (MySQLIntegrityConstraintViolationException ex) {
}
catch (SQLException ex) {
}

获得以下错误,我希望它能运行catch (MySQLIntegrityConstraintViolationException ex)函数。

11:12:06 AM DAO.UserDAO createUser
SEVERE: null
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry 'idjaisjddiaij123ij' for key 'udid'

为什么它正在运行catch (SQLException ex)而不是catch (MySQLIntegrityConstraintViolationException ex)

5 个答案:

答案 0 :(得分:6)

确保使用正确的命名空间。对我来说,附在图像上的人就像魅力一样。

Correct namespace

答案 1 :(得分:2)

MySQL总是thow并在执行方法中捕获SQLException。你要做的就是在执行方法中捕获SQLException,然后抛出新的MySQLIntegrityConstraintViolationException

public void executeQuery() {
    try {
        // code
        rs = pstmt.executeQuery();
} catch (SQLException ex) {
   throw new MySQLIntegrityConstraintViolationException(ex);
}

所以在调用execute方法的外部方法中,它应该只捕获MySQLIntegrityConstraintViolationException

catch (MySQLIntegrityConstraintViolationException ex) {
   //handle ex
}

答案 2 :(得分:1)

我建议使用ex instanceof MySQLIntegrityConstraintViolationException来确保没有抛出其他异常作为MySQLIntegrityConstraintViolationException,因为抛出SQLException会有很多不同的原因。

答案 3 :(得分:0)

请导入

avg.result_display

我测试了它会起作用。

答案 4 :(得分:0)

我遇到了同样的问题,我不得不通过JOptionPane消息向用户显示错误类型。这是我的解决方法

public boolean executeQuery() {
try {
        // code
        rs = pstmt.executeQuery();
} catch (SQLException ex) {
   int errCode = ex.getErrorCode();
     if(errCode == 1062){ //MySQLIntegrityConstraintViolationException 
     JOptionPane.showMessageDialog(null, "Duplicate entry for id.\n");}
     return false;
}