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..."也会显示..
对于初学者来说,如果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有用的原因有两个:
它通常是,在该代码的可能性try块引发另一个异常,在规定的一个catch(多个)方框,在这种情况下finally仍然会被执行.
如果有一个return/ break/ continue声明在try有外界影响块try的块(例如,break在try一个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,则需要您定义变量等(此外,如果在读取文件时出现问题,它当然不会关闭文件).
如果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的设计者会引入一种新的机制,你的代码仍然会受到"保护".由于设计人员考虑了所有这些可能性,因此始终建议使用编程语言提供的基础结构.
| 归档时间: |
|
| 查看次数: |
547 次 |
| 最近记录: |