public class FinallyDemo03 {
public static void main(String[] args){
System.out.println(test("0")+"\n"+test(null)+"\n"+test(""));
}
private static int test(String string) {
try{
return string.charAt(0)-'0';
}catch(NullPointerException e){
return 1;
}catch(Exception e){
return 2;
}finally{
return 3;
}
}
}
结果 3 3 3
如果在finally语句块中添加return ,而且上面的语句块中也有return 那么这个时候上面的return执行之后最终还是会运行finally语句块,这个时候finally中的return 就会覆盖掉上面语句块的return 意思就是说只有有fianally语句块return 回去的永远都是finally语句块中的值。
去掉finally
public class FinallyDemo03 {
public static void main(String[] args){
System.out.println(test("0")+"\n"+test(null)+"\n"+test(""));
}
private static int test(String string) {
try{
return string.charAt(0)-'0';
}catch(NullPointerException e){
return 1;
}catch(Exception e){
return 2;
}
}
}
结果 0 1 2
第一个结果 因为主方法传过来的值时‘0’这个字符,在方法中运行的时候charAt检索到‘0’但是return 中减掉了所有说int b=a-a; b=0;
第二个结果 null直接出现空指针异常 return 2
第三个结果 字符越界,charAt根本找不到有任何值,如果有那就是字符越界产生异常 return 2
请分别说明final ,finally,finalize
*
- finalize 是Object继承的类(也就是说所有的类都会拥有这个类)该方法是当GC(垃圾回收器)释放该对象资源时
- 调用此方法,调用后该对象对释放。
- 但是这个方法不需要被所在类调用,即使特殊
- 需要重写,也需要谨慎。注意,此方法若重写,里面不应当有耗时的操作
final 关键字 修饰符,用于修饰变量,方法,被修饰的不能被改变不能被重写。最终的意思,常见于底层代码
finally异常处理机制中的字符串,作用是不管是否出错都会被执行,常用于流的关闭