我想知道为什么finally
在try 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..."
..
答案 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
很有用:
try
块中的代码通常可能会引发 catch
块中指定的另一个异常,其中案例finally
仍将执行。
如果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
,则需要您定义变量等(此外,如果出现问题)在阅读文件时,它当然不会关闭文件。)
如果轮次上的 finally
块抛出异常,最后将再次执行。
它还允许您在抛出异常后执行某些操作,但不捕获异常:如果从未捕获异常,则会进一步抛出异常。如果:
catch
构造的try {
throw new SomeException("The culprit!");
} finally {
System.out.println("Some closing words.");
}
及其堆栈跟踪不是" toched"通过SomeException
块:堆栈跟踪不会改变。因此,错误修正程序可以找出最初抛出异常的位置。
一般情况下,在finally
中离开try-catch
(零个或多个catch
es)块之前编写必须完成的所有内容是很好的,因为它可以保护您免受攻击各种角落案件。
更多编程语言理论,finally
,return
,break
,continue
等都是代码路径更改机制。 throw
语句会保护您,如果出现此类行为,您将受到保护。如果以后Java的设计者会引入一种新的机制,你的代码仍然会受到保护"。由于设计人员将所有这些可能性考虑在内,因此始终建议使用编程语言提供的基础设施。