Java:捕获特定异常

Java:捕获特定异常,java,Java,假设我有以下几点 try{ //something }catch(Exception generic){ //catch all }catch(SpecificException se){ //catch specific exception only } 遇到特定异常时会发生什么?它是否先将其作为一般异常捕获,然后再捕获特定异常 或者它只捕获SpecificException而忽略泛型异常 try { try{ //something }catch(SpecificExcepti

假设我有以下几点

try{
//something
}catch(Exception generic){
//catch all
}catch(SpecificException se){
//catch specific exception only
}
遇到特定异常时会发生什么?它是否先将其作为一般异常捕获,然后再捕获特定异常

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

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

我不希望捕获泛型异常和特殊异常。

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

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

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

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

IOException的不可访问捕获块。它已由异常的catch块处理


所以用另一种方式来定义它们。只有特定的一个将被捕获。

否。所有异常都将被第一个块捕获。第二个将永远不会到达(编译器会识别出这一点,从而导致由于无法访问代码而导致的错误)。如果您想专门处理
specificeexception
,则必须采用另一种方法:

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

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

作为旁注,调用两个捕获块的唯一方法是使用嵌套异常

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

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


只需重新排序catch子句。

我的主张-catch SQLException并检查代码

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

我不明白为什么这是公认的答案。尝试按原始问题中显示的顺序捕获异常会导致编译错误,因此“所有异常都将被第一个块捕获”语句不适用。是否已使用javac检查过?在eclipse中,它失败了,但javac可能只是发出警告。我以为Michael指的是他发布的代码,在这种情况下,他的声明是正确的。我以12票知道下面的答案。然而,在我之前阅读duffymo的以下答案时,它比我目前选择的答案要短得多。这个选择的答案非常引人注目,因为它直接回答了我的问题,并指出了我在代码中错误的具体位置。然后,如果我让我的原始代码执行,结果会怎样。我非常喜欢这个问题的排序布局格式。提供的所有其他答案都同样出色,但出于本能,我倾向于逆向选择。谢谢大家。@heysup:我想关键是您不能让原始代码执行,因为编译器会报告错误。编译错误意味着没有创建
.class
文件,因此没有要运行的代码。假设编译器允许我们以任何顺序编写异常。这会有什么不同?我看不出有什么不同。那么,为什么要执行命令呢?想象一下,我是一个富人,比他年轻20岁。这会有什么不同?想象你想要的一切,但这就是JDK的工作原理。有了这种逻辑,为什么还要费心去寻找任何理由呢?为什么java不允许多重继承?谁在乎呢?就是这样。明白我想说的意思了吗?是的,我的问题不重要也不重要。但知道答案会很好。不,有很多文档解释了为什么Java不允许实现的多重继承(接口的MI是完全可以的)。这个问题已经问了3.5年了。你对这些评论有何补充?我什么也看不见。去找一个更好的方法来提升你的814代表,而不是成为一个评论巨魔。我不知道你这是什么意思。没有分数对你来说是件好事,因为如果可以的话,我会投反对票。有趣的是,当所有其他人都说同样的该死的话时,你却似乎挑出了我的答案。去学习如何编码。问题包含的代码会产生编译时错误。一般例外应在特定例外之后。我担心这是唯一的方法:(