try { int i = 2/0; int k = 10; } catch (ArithmeticException e) { } System.out.println("ttt"); try { int i = 2/0; int k = 10; } catch (ArithmeticException e) { } finally { System.out.println("ttt");} 那么这两段代码有什么不同?无论用或不用finally,都会打印ttt,那么finally到底有什么用处?
finally 是必须执行的!除退出JVM
try {
Object result = res.doSomething(); // 利用资源做某些操作,可能发生异常
return result; // 返回结果
}
catch (SomeException ex) {
// 处理异常
}
finally {
releaseMyResource(res); // 无论是否发生异常,资源都应该被释放
}
try {
int i = 2/0;
int k = 10;
} catch (ArithmeticException e) { }
System.out.println("ttt");
try {
int i = 2/0;
int k = 10;
} catch (ArithmeticException e) { }
finally { System.out.println("ttt");}
那么这两段代码有什么不同?无论用或不用finally,都会打印ttt,那么finally到底有什么用处?
try { Object result = res.doSomething(); // 利用资源做某些操作,可能发生异常
return result; // 返回结果
} catch (SomeException ex) { // 处理异常
} releaseMyResource(res); // 无论是否发生异常,资源都应该被释放 不写finally不是一样的么?
public static void main(String[] args) throws Exception {
try {
int a = 2/0;
} catch (Exception e) {
throw (new Exception());
}
System.out.println("123");
}
这样就不打印了.
try { Object result = res.doSomething(); // 利用资源做某些操作,可能发生异常
return result; // 返回结果
} catch (SomeException ex) { // 处理异常
} releaseMyResource(res); // 无论是否发生异常,资源都应该被释放 不写finally不是一样的么?
------------问题1:return前没释放资源
问题2:处理异常时如果出现新异常,也造成资源未释放
finally 块确保 close 方法总被执行,而不管 try 块内是否发出异常。因此,可以确保在退出该方法之前总会调用 close 方法。这样您就可以确信套接字被关闭并且您没有泄漏资源。在此方法中不需要再有一个 catch 块。在第一个示例中提供 catch 块只是为了关闭套接字,现在这是通过 finally 关闭的。如果您确实提供了一个 catch 块,则 finally 块中的代码在 catch 块完成以后执行。finally 块必须与 try 或 try/catch 块配合使用。此外,不可能退出 try 块而不执行其 finally 块。如果 finally 块存在,则它总会执行。(无论从那点看,这个陈述都是正确的。有一种方法可以退出 try 块而不执行 finally 块。如果代码在 try 内部执行一条 System.exit(0); 语句,则应用程序终止而不会执行 finally 执行。另一方面,如果您在 try 块执行期间拨掉电源,finally 也不会执行。)
以保证流和数据库资源什么的,哪怕在产生异常时都能关闭。
JDBC中也使用的比较多!
2.自己在thinking in java (4edition p664)里看的。后台线程不执行fanally语句就会终止run方法。