1、
当子类重写父类的带有 throws 声明的函数时,其 throws 声明的异常必须在父类异常的可控范围内 —— 用于处理父类的 throws 方法的异常处理器,必须也适用于子类的这个带 throws 方法 。这是为了支持多态。
例如,父类方法 throws 的是 2 个异常,子类就不能 throws 3 个及以上的异常。父类 throws IOException,子类就必须 throws IOException 或者 IOException 的子类。
2、
在 try 块中即便有 return,break,continue 等改变执行流的语句,finally 也会执行。
也就是说:try…catch…finally 中的 return 只要能执行,就都执行了,他们共同向同一个内存地址(假设地址是 0×80)写入返回值,后执行的将覆盖先执行的数据,而真正被调用者取的返回值就是最后一次写入的。
finally 中的 return 会覆盖 try 或者 catch 中的返回值。
finally 中的 return 会抑制(消灭)前面 try 或者 catch 块中的异常
finally 中的异常会覆盖(消灭)前面 try 或者 catch 中的异常
示例1:
public static String m1(){
try{
System.out.println("this is try method");
return "this is try return";
}catch(Exception e){
e.printStackTrace();
}finally{
System.out.println("this is finally method");
return "this is finally return";
}
}
public static void main(String[] args) {
System.out.println(m1());
}
上述执行结果为:
this is try method
this is finally method
this is finally return
示例2:
public static String m1(){
try{
System.out.println("this is try method");
return "this is try return";
}catch(Exception e){
e.printStackTrace();
}finally{
System.out.println("this is finally method");
// return "this is finally return";
}
return "this is last return";
}
public static void main(String[] args) {
System.out.println(m1());
}
执行结果为:
this is try method
this is finally method
this is try return
注:三个return 同时出现会编译错误
建议:
不要在 fianlly 中使用 return。
不要在 finally 中抛出异常。
减轻 finally 的任务,不要在 finally 中做一些其它的事情,finally 块仅仅用来释放资源是最合适的。
将尽量将所有的 return 写在函数的最后面,而不是 try … catch … finally 中。