try{
//执行的代码,其中可能有异常。一旦发生异常,则立即调到catch执行。否则不执行catch里面的内容。
}catch{
//除非try里执行代码发生了异常,否则这里的代码不会执行。
}finally{
//不管什么情况都会执行,包括try catch里面用了return,可以理解为只要执行了try或者catch,就一定会执行finally
}
public class test3 {
public static void aMethod() throws Exception{
try{
throw new Exception();
}finally{
System.out.println("finally");
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
try{
aMethod();
}catch(Exception e){
System.out.println("exception");
}
System.out.println("finish");
}
}
// finally exception finish
总结:
1.将预见可能引发异常的代码包含在try语句块中。
2.如果发生了异常,则转入catch的执行。catch的几种写法:
catch 这将捕获任何发生的异常
catch(Exception e) 这将捕获任何发生的异常,使用e参数来获得有关异常的信息
catch(Exception的派生类 e) 捕获派生类定义的异常
catch可以有多个,也可以没有,每个catch可以处理一个特定的异常。按照catch的顺序查找异常处理块,如果找到,则进行处理,如果找不到,则向上一层次抛出。如果没有上一层次,则向用户抛出,此时,如果你在调试,程序将中断运行,如果是不熟的程序,将会终止。
3.finally
finally可以没有,也可以只有一个。无论有没有发生异常,它总会在这个异常处理结构的最后运行。即使自try块内用return返回了,finally总是要执行,以便最后做些清理工作,如关闭数据库连接等。
注意:catch和finally必须存在一个
public class FinallyDemo {
public static void main(String[] args) {
System.out.println(getInt());//40
}
public static int getInt() {
int a = 10;
try {
System.out.println(a / 0);
a = 20;
} catch (ArithmeticException e) {
a = 30;
return a;
/*
* return a 在程序执行到这一步的时候,这里不是return a 而是 return 30;这个返回路径就形成了
* 但是呢,它发现后面还有finally,所以继续执行finally的内容,a=40
* 再次回到以前的路径,继续走return 30,形成返回路径之后,这里的a就不是a变量了,而是常量30
*/
} finally {
a = 40;
return a; //如果这样,就又重新形成了一条返回路径,由于只能通过1个return返回,所以这里直接返回40
}
// return a;
}
}