|    
  
  public  
  class Ex1 { 
  
 public  
  static  
  void main(String[] args) {
 System.out.println(Ex1.getResult());
 }
 
 public  
  static  
  int getResult(){
 int a =100;
 
 try{
 return a+10;  
  // 
  注意,java的基础数据类型是值传递,这里的返回值已经和上面的a没有关系了
 } 
  catch(Exception e){
 
               e.printStackTrace();   
  } 
  finally{
 return a;     
  // 
  最后再把值重定向到a(相当于将try中的返回值覆盖掉),所以输出还是100
 }
 }
 }
  再看一个例子:    
  
  public  
  class Ex1 { 
  
 public  
  static  
  void main(String[] args) {
 try{
 System.out.println(Ex1.getResult());
 } 
  catch(Exception e){
 e.printStackTrace();
 System.out.println("截获异常catch");
 } 
  finally{
 System.out.println("异常处理finally");
 }
 }
 
 public  
  static  
  int getResult()  
  throws Exception{
 int a =100;
 
 try{
 
 a=a+10;
 throw  
  new RuntimeException();
 } 
  catch(Exception e){
 System.out.println("截获异常并重新抛出异常");
 throw  
  new Exception();
 } 
  finally{
 return a;
 }
 }
 }
 输出如下: 截获异常并重新抛出异常110
 异常处理finally
 关键的“截获异常catch”却没有执行!!!
 原因是在getResult()的finally中return一个值,等同于告诉编译器该方法没有异常,但实际上异常是有的,这样的结果是该方法的调用者却捕获不到异常,相对于异常被无端的被吃掉了,隐藏杀机啊!! 结论:不要再finally中试图return一个值,这样可能会导致一些意想不到的逻辑错误,finally就是用来释放资源的!! |