什么"躲避异常"是什么意思?

use*_*159 36 java terminology exception

在Java™教程的"例外优势"部分中:

一个方法可以避免在其中抛出的任何异常,从而允许一个方法更远的调用栈来捕获它.

[...]

...避免异常需要中间人方法的一些努力.必须在其throws子句中指定可以在方法中抛出的任何已检查异常.

"鸭子异常"在这里意味着什么?我搜索了网络和FOLDOC(免费在线计算词典),但没有找到任何看起来很有希望的东西.

jmc*_*mcg 29

好吧,躲避只是意味着降低你的头部,以避免被击中或看到.在这种情况下,"避免异常"只是意味着避免代码被异常击中.

对于不被异常命中的方法,通过throws在方法上声明异常,将其抛出调用堆栈

public void myMethod() throws IOException {

}
Run Code Online (Sandbox Code Playgroud)

如果你不躲避,你必须这样catch做:

public void myMethod() {
    try {
       // ...  

    } catch(IOException e) {
      // handle exception
    }
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,由于Java没有提供异常方法来触及面部方法,因此这些只是两个选项. (26认同)

Tun*_*aki 27

"躲避异常"意味着"不处理异常".这实际上解释了这个名字:鸭子意味着"逃避;躲闪".

避免异常的方法根本不处理它(例如,因为它不是它的目的)并且将异常抛出到调用方法.

例如,考虑一种方法,其目的是计算文件中的行数.这将是一个简单的实现(Java 8):

private static long numberOfLines(Path path) throws IOException {
    try (BufferedReader br = Files.newBufferedReader(path)) {
        return br.lines().count();
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,此方法不会处理由此IOException引发的方法Files.newBufferedReader(path),因为这不是方法目标.它躲避并让调用者适当地处理它.

注意呼叫者也可能鸭肉异常,并让主叫处理它,等等.


Nik*_* M. 5

我认为这意味着一个方法可以捕获异常并重新抛出它以获取其他方法来捕获它并根据需要处理它.或者只是抛出一个新的例外.或者避免捕获异常并让它冒泡调用堆栈.关键是让方法将异常处理委托给其他方法,这可能更适合处理给定的异常(例如,通过访问必要的数据和/或状态).但是(因为java)这需要一直使用throws子句声明方法,这很容易成为样板

正如在@ jmcg的评论中提到的那样,字面意思是" DUCK只是为了避免被击中或看到而降低你的头 "(就像鸭子在河里做的那样)

  • 嗯,你已经解释了一些案例,但我不认为你真的回答了这个问题 - 这是非常具体的:"鸭子"是一个例外.如果它说"处理"异常,那么我认为你描述的案例会更有效. (2认同)