有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java:捕获特定异常

假设我有以下几点

try{
//something
}catch(Exception generic){
//catch all
}catch(SpecificException se){
//catch specific exception only
}

遇到特定异常时会发生什么?它是否先将其作为一般异常捕获,然后再捕获特定异常

或者它只捕获SpecificException而忽略泛型异常

我不希望通用异常和特定异常都被捕获


共 (6) 个答案

  1. # 1 楼答案

    这不会编译。您将被告知无法访问特定的异常块

    首先必须有更具体的异常捕获块,然后是常规块

    try
    {
        //something
    } 
    catch(SpecificException se)
    {
        //catch specific exception only
    }
    catch(Exception generic)
    {
        //catch all
    }
    
  2. # 2 楼答案

    这不会使用eclipse编译器编译:

    Unreachable catch block for IOException. It is already handled by the catch block for Exception

    所以用另一种方式来定义它们。只有特定的一个会被抓到

  3. # 3 楼答案

    按顺序尝试catch块,并执行第一个与异常类型匹配的块。由于Exception是所有异常类型的超类,因此它将始终在该实例中执行,并且永远不会执行特定的情况。事实上,编译器足够聪明,可以注意到这一点并引发编译错误

    只需重新排列catch子句

  4. # 4 楼答案

    不。所有异常都将被第一个块捕获。第二个将永远无法到达(编译器可以识别,这会导致由于无法访问代码而导致错误)。如果你想特别对待SpecificException,你必须反过来:

    }catch(SpecificException se){
    //catch specific exception only
    }catch(Exception generic){
    //catch all
    }
    

    然后SpecificException将被第一个块捕获,所有其他块将被第二个块捕获

  5. # 5 楼答案

    我的建议是捕获SQLException并检查代码

    try {
        getConnectionSYS(dbConfigFile, properties);
    } catch (SQLException e){
        if (e.getErrorCode()==1017){
            getConnectionUSER(dbConfigFile, properties);
        } else {
            throw e;
        }
    }
    
  6. # 6 楼答案

    作为补充说明,调用两个catch块的唯一方法是使用嵌套异常

    try {
      try{
      //something
      }catch(SpecificException se){
      //catch specific exception only
      throw se;
      }
    }catch(Exception generic){
    //catch all
    }