zoukankan      html  css  js  c++  java
  • java异常处理:finally中不要return

    java异常处理:finally中不要return
     
    
    复制代码
    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就是用来释放资源的!!
    
  • 相关阅读:
    jemter 90%line的解释
    JMeter 不同线程组间变量传递(亲测 ok)
    nginx的url规则小tips
    redis水平扩展实践,完全配置,无需代码改动
    基于nginx + lua实现的反向代理动态更新
    基于redis 3.x搭建集群环境
    简单监控脚本细节分析
    简单的应用服务器性能监控
    Elasticsearch的脚本化数据导入导出
    A* search算法
  • 原文地址:https://www.cnblogs.com/wzhanke/p/4778654.html
Copyright © 2011-2022 走看看