Java SQLException 根据错误代码分开

Java SQLException separate according to errorcode

我需要根据ErrorCode分开SQLExceptions。我在 catch block 中有以下 if 语句,但总是打印 else 条件。

catch (SQLException ex) {

      if (ex.getErrorCode() == 28502){
         System.out.println("Username Problem");
      }

      else{
         System.out.println("Other Problem");
      }  

     Logger.getLogger(FirstTimeMainFrame.class.getName()).log(Level.SEVERE, null, ex);

}

实际上,当我在创建数据库时输入意外的username时,会抛出以下SQLExceptions

java.sql.SQLException: Failed to create database 'myDB', see the next exception for details.
//rest of exception.
Caused by: ERROR XJ041: Failed to create database 'myDB', see the next exception for details.
//rest of exception.
Caused by: ERROR XBM01: Startup failed due to an exception. See next exception for details
//rest of exception.
Caused by: ERROR 28502: The user name 'AAA.AAA' is not valid.
//rest of exception.

但是我的 catch 总是打印 Other Problem。我怎样才能根据上一个ErrorCode分开不同的SQLExceptions

您应该使用捕获的 SqlExeption 对象的 'getCause()' 方法来获取原因异常。然后,您可以将结果转换为 Exception 并检查其错误代码。
检查此以获取更多信息:Throwable.getCause()

编辑:

SQLException temp = ex;
while(temp.getCause() != null)
{
     temp = (Exception)temp.getCause();
}
//  check if temp is SQLException and if it is check ((SQLException)temp).getErrorCode() == whatever you want

--- 已解决 ---

首先感谢@blm 的路由评论。

技巧是; 其他 Exceptions(第 1 和第 2 个)在 SQLState 中有 String 个值 SQLState 只有数值 ErrorCode.

SQLException 第三链 exception28502 SQLStateErrorCode。我认为这就是第 1 和第 2 之间的区别 Exceptions

所以我改变了我的

捕捉块;

catch (SQLException se) {

      do {

         if(se.getSQLState().equals("28502")){
            System.out.println("Username Problem");
         }

         else{
            System.out.println("Other Problem");
         }  

      } while ((se = se.getNextException()) != null);

}

输出为;

Other Problem
Other Problem
Username Problem