Java中try catch finally中几个问题

关于try catch finally中的几个问题基本上都是为了应对面试的,当然有些也是为了加深认识。

一、try catch finally中finally中代码不执行的情况

1.try catch 中存在死循环[while(true)死循环],而且代码中不会抛出异常;
  • 正常的代码:类似的例子如Android主线程中Handler的Looper循环线程一样;
  • 程序中bug:当然也可能是程序中业务逻辑bug导致死循环,这样就是这条线程一直循环,程序出口锁死类型的bug;
2.在try catch 的代码块中发生死锁,线程在try catch代码块中永久阻塞啦;
  • 当然这也应该属于bug类型的情况,因为实在想不出什么场景有这样的需求;
3.在线程的中代码块执行到try catch 时,进程中执行了JVM退出代码;

常见的主动退出代码有:

  • System.exit(int status);
  • Runtime.getRuntime().exit(int status);
  • Runtime.getRuntime().halt(int status);
  • 运维直接输入Ctrl+C快捷操作等其他主动退出JVM的操作
4.在线程的中代码块执行到try catch 时,发生异常JVM退出

异常分为:应用内异常和其他异常
应用内异常属于可控异常:

  • 代码块执行到try catch 时,应用内其他线程发生异常【未捕获、捕获失败】导致进程退出;例如:RuntimeException()、OOM等

其他异常属于不控异常【和代码无关的异常,有点无厘头】

  • 代码块执行到try catch 时,发生不可控异常导致JVM退出;例如:服务器系统Crash系统重启、机房断电、手残按在电源键、脚残踢断插座、服务器硬件故障等【无厘头的原因】
缘由总结分类:

a.程序执行在try catch 代码中后进入死循环操作(1.正常的业务逻辑,2.程序bug导致);
b.程序执行在try catch 代码后线程阻塞停止执行(1.死锁现象,2.进程Crash);
c.程序执行在try catch 代码时,发生不可控异常(与代码无关的异常);

二、try catch finally中finally中代码return的情况

这也是面试题中的常客,常见的类型有:
先以try{return} catch(){}finally{} return类型为例,
验证代码如下:

   public static void main(String[] args) {
        System.out.println("return  main  ================= >"+tryTest());
         //System.out.println("return  main  ================= >"+tryTestFinally());
   }

   private  static String tryTest(){
        String result = null;
        try {
            Thread.sleep(1000);
             result= "Random NUM :"+new Random().nextInt();
            System.out.println("try catch return 0 ------- > "+result);
            return result;
        }catch (Exception e){
            System.out.println("Exception ------- > "+e.toString());
        }finally {
            result="finally"+new Random().nextInt();
            System.out.println("finally ------- > ");
        }
        System.out.println("try catch return 1 ------- > "+result);
        return result;
    }

  private  static String tryTestFinally(){
        String result = null;
        try {
            Thread.sleep(1000);
             result= "Random NUM :"+new Random().nextInt();
            System.out.println("try catch return 0 ------- > "+result);
            return result;
        }catch (Exception e){
            System.out.println("Exception ------- > "+e.toString());
        }finally {
            result="finally"+new Random().nextInt();
            System.out.println("finally ------- > ");
            return result;
        }
    }

     //tryTest()代码执行结果【JDK1.8】
     try catch return 0 ------- > Random NUM :-2081958692
     finally ------- > 
     return  main  ================= >Random NUM :-2081958692

    //tryTestFinally()代码执行结果【JDK1.8】
    try catch return 0 ------- > Random NUM :-1463471368
    finally ------- > 
    return  main  ================= >finally1838356288

当然还有其他类型的组合方式,但是究其所以都遵循同样的原则,至于各种组合和验证代码,就是so easy了,在此不一一列举,如果有兴趣参考try catch finally中return情况,如果还不明白那就改行吧。

最终结论
  • 1.不管是什么类型组合、有出现异常,如果finally存在的话,finally块中代码都会执行;

  • 2.无论是哪一种类型,如果finally中没有return语句,如果在 try catch中的代码块执行到return[没有异常抛出],而且在finally中没有return,最终返回结果都是在 try catch中得出的结果,并且执行完finally中的代码块立即返回不在执行其他代码;

  • 3.无论是哪一种类型,如果finally中有return语句,无论try catch中的代码块中有没有return、执行的结果如何[有没有抛出异常],代码执行在finally中return时就会立即返回finally中的结果,并不在执行其他代码;

三、try catch 的性能问题;

关于Java中try catch对性能影响的问题是一直存在争论的,为什么会一直存在这个争论,个人认为是因为:“要在争论中打败无知的人是不可能的”即主要原因是部分开发人员的不严谨的测试流程不得当的测试方法,导致测试得出的错误结论而不自知,并且手持错误结论一直“据理力争”

根据我们学习的基本知识和常识个人比较推荐以下博文:
try catch 对性能影响

Java上的try catch并不影响性能 或者 链接

只推荐上面的文章并是说网上其他的博文都不好,而是刚好看到这两篇博文,个人认为写的不错;而且个人自知水平能力有限,难以得出准确结论,所以个人比较认同他们观点。
个人初步结论:个人比较认同try catch对性能的影响微乎其微的观点,主要是因为对异常进行相应的处理引起的性能消耗,换取对程序的健壮性和安全性有很大的保证个人认为是十分划算的。

当然这并不意味着可以滥用try catch,而是在代码不确定的地方使用,同时建议尽量在小范围内使用try catch,而且catch中的异常尽可能详细方便后期查找,更建议优先考虑程序的健壮性和安全性。

四、欢迎诸位批评指正;

由于个人本身就是半路出家的开发,计算机和编程基础知识浅薄,而且目前工作经验相对欠缺,所以文中难免有纰漏错误之处,望诸位同行朋友海涵不吝赐教,本人不胜感激;

猜你喜欢

转载自blog.csdn.net/black_bird_cn/article/details/82668002
今日推荐