为什么最终在java中有用?

时间:2017-05-11 17:09:18

标签: java try-catch-finally

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

这两个代码有什么区别?

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

和:

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

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

1 个答案:

答案 0 :(得分: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...");
}

最后,至少会尝试写入out。如果您在 try - catch块之后将其写下来,则不会出现这种情况。

由于以下几个原因,finally很有用:

  1. try块中的代码通常可能会引发 catch中指定的另一个异常,其中案例finally仍将执行。

  2. 如果return块中的 break / continue / try声明在{{{}之外生效1}}阻止(例如try循环中break中的try),如果您在for之后写入它,则不会执行try也将被调用。这也会产生更优雅的代码。例如:

    finally

    请注意BufferedReader br = new BufferedReader(new FileReader("file.txt")); try { return br.readLine(); } finally { br.close(); }语句:如果您在没有return的情况下执行文件的close,则需要您定义变量等(此外,如果出现问题)在阅读文件时,它当然不会关闭文件。)

  3. 如果轮次上的 finally块抛出异常,最后将再次执行。

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

    catch

    构造的try { throw new SomeException("The culprit!"); } finally { System.out.println("Some closing words."); } 及其堆栈跟踪不是" toched"通过SomeException块:堆栈跟踪不会改变。因此,错误修正程序可以找出最初抛出异常的位置。

    一般情况下,在finally中离开try-catch(零个或多个catch es)块之前编写必须完成的所有内容是很好的,因为它可以保护您免受攻击各种角落案件。

    更多编程语言理论,finallyreturnbreakcontinue等都是代码路径更改机制。 throw语句会保护您,如果出现此类行为,您将受到保护。如果以后Java的设计者会引入一种新的机制,你的代码仍然会受到保护"。由于设计人员将所有这些可能性考虑在内,因此始终建议使用编程语言提供的基础设施。