finally:在java中try catch块中使用,写在最后一段
finally在代码中必然执行
在这种情况下finally不执行
public static void main(String[] args) {
try {
int a = 10,b = 0;
System.out.println(a/b);//被除数不能为0 会产生异常
}catch (Exception E){
System.out.println("出现了异常");
System.exit(0);//退出程序 之后的代码都不再执行
}finally {
System.out.println("这段代码不会被打印");
}
}
关于finally比较特殊的地方
观察这段代码,可以发现如果finally在一定执行的情况下main函数打印的应该是20,但实际上main函数输出的是10,这时因为在return时会复制一个相同的值去准备返回 虽然finally块运行了,但是改变的其实是a的值,改变不了return复制出来的值,所以最后输出的还是10.
public static void main(String[] args) {
int a = test1();
System.out.println(a);
}
public static int test1(){
int a = 10;
try {
return a;
}catch (Exception e){
}finally {
a = 20;
}
return a;
}
观察下面的代码 与上面的代码大同小异,但这次的返回值确实被改成了20,一样的道理在return p时同样复制了p但此时的p是一个地址 也就是复制了一份地址,所以p.age的值被修改了,但是因为地址是相同的,所以返回时可以返回被修改过后的p.age
public static void main(String[] args) {
Person p = test1();
System.out.println(p.age);
}
public static Person test1(){
Person p = new Person();
try {
p.age = 10;
return p;
}catch (Exception e){
return null;
}finally {
p.age = 20;
}
}
public static class Person{
int age;
}