Java 为什么可以';我不能多次捕捉异常吗?

Java 为什么可以';我不能多次捕捉异常吗?,java,exception,language-lawyer,Java,Exception,Language Lawyer,: try语句执行一个块。如果抛出一个值并重试 语句有一个或多个catch子句可以捕获它,那么 控制权将转移到第一个此类catch子句 例如,对于相同的异常类型,我可能有两个catch子句。但当我尝试此操作时,我将收到编译时错误 public static void main (String[] args) throws java.lang.Exception { try{ } catch(RuntimeException ioe){ } catch(NumberForm

:

try语句执行一个块。如果抛出一个值并重试 语句有一个或多个catch子句可以捕获它,那么 控制权将转移到第一个此类catch子句

例如,对于相同的异常类型,我可能有两个catch子句。但当我尝试此操作时,我将收到编译时错误

public static void main (String[] args) throws java.lang.Exception
{
    try{
    } catch(RuntimeException ioe){
    } catch(NumberFormatException e){ //Already caught
    } 
}


您能用JLS解释一下吗?

因为RunTimeException是NumberFormatException的基类

因为RunTimeException是NumberFormatException的基类

从捕获的异常的层次结构中得到的编译器错误


NumberFormatException扩展了IllegalArgumentException扩展了RuntimeException

将挡块视为安全网。NumberFormatException网络非常小,因为它是更高层次异常的特例。RuntimeException网络是最大的网络之一,它将捕获这个级别上的任何东西(异常和可丢弃的除外,它们是“高级的”)。您所做的是将小网置于大网下方。因此,编译器很有礼貌地给你一个提示,那就是永远不会到达较小的网络

(我知道metapher不是100%精确的,但在这种情况下可以正常工作。)

如果您先捕获NumberFormatException,然后捕获RuntimeException,编译器会很高兴地同意!:-)
您还可以从第一个块中重新显示捕获的异常。

编译器错误您可以从捕获的异常的层次结构中获得结果


NumberFormatException扩展了IllegalArgumentException扩展了RuntimeException

将挡块视为安全网。NumberFormatException网络非常小,因为它是更高层次异常的特例。RuntimeException网络是最大的网络之一,它将捕获这个级别上的任何东西(异常和可丢弃的除外,它们是“高级的”)。您所做的是将小网置于大网下方。因此,编译器很有礼貌地给你一个提示,那就是永远不会到达较小的网络

(我知道metapher不是100%精确的,但在这种情况下可以正常工作。)

如果您先捕获NumberFormatException,然后捕获RuntimeException,编译器会很高兴地同意!:-)
您还可以从第一个块中重新显示捕获的异常。

NumberFormatException是RuntimeException的一个专门化,因此您的NumberFormatException将已经被第一条语句捕获。但是,您可以切换这两个catch子句的顺序;但请记住,只有一个将被执行:

  • 如果异常具有此类型,则返回NumberFormatException子句
  • 所有其他类型的RuntimeException的RuntimeException子句

至于为什么会这样。。。语言就是这样设计的。如果执行了所有匹配的catch块,那么正确处理错误将非常困难。

NumberFormatException是RuntimeException的一个特化,因此您的NumberFormatException将已经被第一条语句捕获。但是,您可以切换这两个catch子句的顺序;但请记住,只有一个将被执行:

  • 如果异常具有此类型,则返回NumberFormatException子句
  • 所有其他类型的RuntimeException的RuntimeException子句

至于为什么会这样。。。语言就是这样设计的。如果执行了所有匹配的捕获块,那么正确处理错误将非常困难。

NumberFormatException
RuntimeException
的子类型。当捕获
RuntimeException
时,它将捕获所有类型的
RuntimeException
,包括
NumberFormatException
。这就是为什么它说已经捕获。

NumberFormatException
RuntimeException
的子类型。当您捕获
RuntimeException
时,它将捕获所有类型的
RuntimeException
,包括
NumberFormatException
。这就是为什么说它已经被抓住了。

是的,我知道。我问为什么我们不能捕获同一个异常两次或多次?因为它在规范中说了“第一”catch子句。是的,我知道。我问为什么我们不能捕获同一个异常两次或两次以上?这是因为它在规范中说了“first”catch子句。您可能有两个,但是
如果类型的联合包含两个选项Di和Dj(I≠ j) 其中,Di是Dj的一个子类型(§4.10.2)。
。如果必须这样做,请放置一个try-catch(NFE)并重新播放它,然后围绕它放置一个try-catch(RE),在同一try语句中多次捕获同一异常有什么意义?编译错误在
不可访问的catch块上非常明显…
@Philipp我这里有类型的并集吗?:如果catch子句可以捕获异常类E1,而紧随其后的try语句的前一catch子句可以捕获E1或E1的超类,则这是编译时错误。最后,这句话正是我想要的@Seelenvirtuose谢谢。您可能有两个选项,但是如果类型的联合包含两个选项Di和Dj(i),则这是一个编译时错误≠ j) 其中,Di是Dj的一个子类型(§4.10.2)。。如果必须这样做,请放置一个try-catch(NFE)并重新播放它,然后围绕它放置一个try-catch(RE),在同一try语句中多次捕获同一异常有什么意义?编译错误在
不可访问的catch块上非常明显…
@Philipp我这里有类型的并集吗?:如果catch子句可以捕获异常类E1,而立即封闭的try语句的前一catch子句可以捕获E1或E1的超类,则这是编译时错误