一.try catch finally 用法
try{//执行的代码,其中可能有异常,则立即跳到catch执行,否则不会执行catch里面的内容}
catch{//除非try里面执行代码发生了异常,否则这里的不会执行}
finally{//不管什么情况下都会执行,包括try catch里面使用了return,可以理解只要执行了try或者catch,则一定会执行}
package day01;
public class demo1 {
public static void aMethod(int arg) throws Exception{
try{
int i =10/arg;//抛出异常
}catch(Exception e){
throw new Exception("Exception in Method");
}finally{
System.out.println("1");
}
}
public static void main(String[] args) {
try{
aMethod(0);//执行aMethod方法;
return;
}catch(Exception e){
System.out.println("Exception in Test");
}finally{
System.out.println("2");
}
}
}
执行顺序:
1;
Exception in Test;
2;
aMethod方法会在try中抛出异常,然后向上级汇报,当然汇报之前,会执行finally操作,因此,结果是先打印finally,然后汇报上级,上级方法main,会捕获异常。
catch里面抛出异常会被main方法再次捕获,所以main方法中的catch会被打印出来。
原因:
1.不管try是否抛出异常,即使try里面包含了return,返回之前也会执行finally操作。
2.这样有助于我们处理一些操作,比如,关闭数据库连接,不管是否发生异常,都会先关闭连接然后在做汇报上级的操作。
3.finally可以没有,也可以只有一个。无论有没有发生异常,它总会在这个异常处理结构的最后运行。即使你在try块内使用return返回了,在返回前,finally总是要执行,这以便让你有机会能够在异常处理最后做一些清理工作。如关闭数据库连接。(finally的使用重点)
如果没有catch语句块,那么finally块就是必须的。
典型案例:
try
{
DataConnection.Open();
DataCommand.ExecuteReader();
...
return;
}
finally
{
DataConnection.Close();
}
无论如何抛出异常,也无论从什么地方return返回,finally语句块总是会执行,有机会调用Close来关闭数据库连接,以便于释放已经产生的连接,释放资源。