something()
是什么,finally
语句块总是会被执行?try {
something();
return success;
}
catch (Exception e) {
return failure;
}
finally {
System.out.println("I don't know if this will get printed out");
}
something()
是什么,finally
语句块总是会被执行?try {
something();
return success;
}
catch (Exception e) {
return failure;
}
finally {
System.out.println("I don't know if this will get printed out");
}
class A {
public static void main(String args[]){
DataInputStream cin = new DataInputStream(System.in);
try{
int i=Integer.parseInt(cin.readLine());
}catch(ArithmeticException e){
}catch(Exception e){
System.exit(0);//Program terminates before executing finally block
}finally{
System.out.println("Won't be executed");
System.out.println("No error");
}
}
}
无论是由JVM崩溃还是调用System.exit(0)
导致的异常程序终止,finally块始终会被执行。
另外,任何在finally块中返回的值都会覆盖在finally块执行之前返回的值,因此在使用try finally时要小心检查所有退出点。
在finally中的返回语句会丢弃任何异常。
http://jamesjava.blogspot.com/2006/03/dont-return-in-finally-clause.htmlfinally块总是会被执行,这是其存在的意义所在。即使它出现在return语句之后,也不代表它就是按照这种顺序实现的。Java运行时有责任在退出try块时运行此代码。
例如,如果您有以下代码:
int foo() {
try {
return 42;
}
finally {
System.out.println("done");
}
}
运行时会生成类似于以下内容:
int foo() {
int ret = 42;
System.out.println("done");
return 42;
}
如果有未被捕获的异常被抛出,finally
块将会运行,并且异常会继续传播。
Java语言规范在14.20.2处描述了try
-catch
-finally
和try
-catch
块的工作原理。
在任何地方都没有指定finally
块总是被执行。
但对于所有try
-catch
-finally
和try
-finally
块完成的情况,在完成之前它确实指定了必须先执行finally
。
try {
CODE inside the try block
}
finally {
FIN code inside finally block
}
NEXT code executed after the try-finally block (may be in a different method).
JLS不能保证在CODE之后一定执行FIN,但它保证如果执行了CODE和NEXT,那么FIN将始终在CODE之后且在NEXT之前执行。
为什么JLS不能保证finally
块总是在try
块之后执行?因为这是不可能的。 虚拟机可能会在完成try
块后但在执行finally
块之前被中止(杀死,崩溃,关机),尽管这不太可能发生。对此JLS无能为力。
因此,任何软件如果需要finally
块始终在try
块完成后执行才能正确运行,则存在缺陷。
try
块中的return
指令与此问题无关。如果执行到try
-catch
-finally
之后的代码,则保证已经在try
块内部是否有return
指令之前执行了finally
块。
finally
块进行资源清理以防止泄漏。否则你会怎么做呢?同样,您也不能(或者不应该……)捕获 Error
,因为正常应用程序通常没有合理的处理方式。 - filpafinally
可能(经过足够的时间,很可能会)导致错误,但是额外的开发(和测试)时间是否值得潜在的几乎不可察觉的稳定性改善呢?更一般地说:应该投入到特定设计中的关注程度是否取决于涉及的子系统?毕竟时间是宝贵的资源。 :) - filpaAnswer is simple YES.
INPUT:
try{
int divideByZeroException = 5 / 0;
} catch (Exception e) {
System.out.println("catch");
return; // also tried with break; in switch-case, got same output
} finally {
System.out.println("finally");
}
输出:
catch
finally
这是因为你将i的值赋为12,但没有将i的值返回给函数。正确的代码如下:
public static int test() {
int i = 0;
try {
return i;
} finally {
i = 12;
System.out.println("finally trumps return.");
return i;
}
}
由于无论如何,除非您调用System.exit()
(或线程崩溃),否则finally块将始终被调用。
是的,finally块中的代码将会被执行。这也是使用finally关键字的主要目的。如果跳出try/catch块可以直接跳过finally块,那么就相当于将System.out.println语句放在try/catch块之外。
finally
;_finalizer_指的是finalize()
方法。 - jaco0646