为什么最终在java中有用?

M.F*_*rru 3 java try-catch-finally

我想知道为什么测试finally后有用try catch呢?在任何情况下,finally将执行语句后定义的代码.

这两个代码有什么区别?

try{
    int a = 1 / 0;
} catch(ArithmeticException e){
    System.out.print("Hi");
} finally {
    System.out.print("It's me again...");
}
Run Code Online (Sandbox Code Playgroud)

并且:

    try{
    int a = 1 / 0;
} catch(ArithmeticException e){
    System.out.print("Hi");
}
System.out.print("It's me again...");
Run Code Online (Sandbox Code Playgroud)

即使出现错误,"It's me again..."也会显示..

Wil*_*sem 5

对于初学者来说,如果System.out流被关闭,并且catch块因此引发异常,则仍将执行finally块.所以这两者并不等同.所以在以下情况下:

System.out.close();
try{
    int a = 1 / 0;
} catch(ArithmeticException e){
    System.out.print("Hi");
} finally {
    System.out.print("It's me again...");
}
Run Code Online (Sandbox Code Playgroud)

最后至少会尝试写入out.如果你在- block 之后写它,情况就不是这样了.trycatch

finally有用的原因有两个:

  1. 它通常是,在该代码的可能性try块引发另一个异常,在规定的一个catch(多个)方框,在这种情况下finally仍然会被执行.

  2. 如果有一个return/ break/ continue声明try有外界影响块try的块(例如,breaktry一个for循环),它不会被执行,如果你以后写出来try,那么finally也将被调用.这也会产生更优雅的代码.例如:

    BufferedReader br = new BufferedReader(new FileReader("file.txt"));
    
    try {
        return br.readLine();
    } finally {
        br.close();
    }
    Run Code Online (Sandbox Code Playgroud)

    请注意return声明:如果您close在没有a的情况下执行该文件finally,则需要您定义变量等(此外,如果在读取文件时出现问题,它当然不会关闭文件).

  3. 如果catch轮到他们发出异常,最后将再次执行.

它还允许您在抛出异常后执行某些操作,但不捕获异常:如果从未捕获异常,则会进一步抛出异常.的情况下:

try {
    throw new SomeException("The culprit!");
} finally {
    System.out.println("Some closing words.");
}
Run Code Online (Sandbox Code Playgroud)

构造SomeException及其finally堆栈跟踪不会被块"拖拽" :堆栈跟踪不会改变.因此,错误修正程序可以找出最初抛出异常的位置.

一般来说,在将a try-catch(零个或多个catches)块保留在a 之前编写必须完成的所有内容是很好的finally,因为它可以保护您免受各种极端情况的影响.

更多进入编程语言理论,return,break,continue,throw,等都是代码路径改变的机制.一finally,在这种行为的情况下,你是保护声明警卫.如果以后Java的设计者会引入一种新的机制,你的代码仍然会受到"保护".由于设计人员考虑了所有这些可能性,因此始终建议使用编程语言提供的基础结构.