异常的处理机制try-catch-final

「这是我参与11月更文挑战的第15天,活动详情查看:2021最后一次更文挑战」。

茫茫人海千千万万,感谢这一秒你看到这里。希望我的文章对你的有所帮助!

愿你在未来的日子,保持热爱,奔赴山海!

题记:昨天我们已经了解部分的异常的处理机制,接下来就让我们继续一起看下在Java中其他形式去处理异常,Java的异常处理机制!

😮异常的处理机制(重点)

在 Java 应用程序中,异常处理机制为:抛出异常,捕捉异常。

异常处理

🟠 try-finally 形式:

 try{   
  //(尝试运行的)程序代码   
}finally{   
  //异常发生,总是要执行的代码   
}  
复制代码

try-finally表示对一段代码不管执行情况如何,都会走 finally 中的代码,

例如:

public class TryFinallyDemo {
    public static void main(String[] args) {
        int a = 10;
        int b = 0;
        try{
            System.out.println(a / b);
            System.out.println("会走try吗");
        }finally{
            System.out.println("会finally吗");//会finally吗
        }
​
        System.out.println("会走外面吗");
        /*
            没有捕获的话,他只会走finally语句然后报出异常。
            会finally吗
            Exception in thread "main" java.lang.ArithmeticException: / by zero
                at com.it.test3.TryFinallyDemo.main(TryFinallyDemo.java:8)
         */
    }
}
复制代码

可以看到程序异常了,还是会去走finally语句块的代码。

🟡 try-catch-finally 形式:

try {  
    // 可能会发生异常的程序代码  
} catch (异常类型A  e){  
    // 捕获并处置try抛出的异常类型A
} finally {  
    // 无论是否发生异常,都将执行的语句块  
} 
复制代码

跟try-finally一样表示对一段代码不管执行情况如何,都会走 finally 中的代码。

当方法中发生异常,异常处之后的代码不会再执行,如果之前获取了一些本地资源需要释放,则需要在方法正常结束时和 catch 语句中都调用释放本地资源的代码,显得代码比较繁琐,finally 语句可以解决这个问题。

例如:

public class TryCatchFinallyDemo {
    public static void main(String[] args) {
        test();
    }
​
    public static void test() {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Date date = null;
        try {
            //date  = simpleDateFormat.parse("2020-10-06");//第一次运行成功
            date  = simpleDateFormat.parse("2020年10月06日");
        } catch (ParseException e) {
            e.printStackTrace();
        }finally{
            System.out.println("finally这里一定会执行");
        }
​
        System.out.println("会走外面这里吗" + date);
    }
}
复制代码

运行成功的代码后结果:

finally这里一定会执行
会走外面这里吗Tue Oct 06 00:00:00 CST 2020
复制代码

运行失败的代码后结果:

java.text.ParseException: Unparseable date: "2020/10/06"
    at java.text.DateFormat.parse(DateFormat.java:366)
    at com.it.test3.TryCatchFinallyDemo.test(TryCatchFinallyDemo.java:19)
    at com.it.test3.TryCatchFinallyDemo.main(TryCatchFinallyDemo.java:12)
finally这里一定会执行
会走外面这里吗null
复制代码

可以看到,无论失败,都会执行finally语句块的代码。

  • 注意:try-catch-finally中,如果catch中 return了,finally还会执行吗?

    public class TryCatchFinallyDemo2 {
        public static void main(String[] args) {
            test();
        }
    ​
        public static void test() {
            int a = 10;
            try{
                System.out.println(a / 0);
            }catch(ArithmeticException e) {
                e.printStackTrace();
                return ;
            }finally {
                System.out.println("finally");
            }
        }
    }
    复制代码

    运行结果:

    java.lang.ArithmeticException: / by zero
        at com.it.test3.TryCatchFinallyDemo2.test(TryCatchFinallyDemo2.java:11)
        at com.it.test3.TryCatchFinallyDemo2.main(TryCatchFinallyDemo2.java:5)
    finally
    复制代码

    可以看到,就算catch中 return了,finally也会执行。

那我们来思考下finally是在return前呢,还是return后呢?这个问题明天我们来回答!

🌸总结

相信各位看官都对异常处理机制的概念有了充分的了解吧,大家好好思考下,有想法的可以回答评论一波,明天我们继续讲解今天遗留下的问题吧!,那我们继续期待下一章的异常更多的内容吧!欢迎期待下一章的到来!

让我们也一起加油吧!本人不才,如有什么缺漏、错误的地方,也欢迎各位人才大佬评论中批评指正!当然如果这篇文章确定对你有点小小帮助的话,也请亲切可爱的人才大佬们给个点赞、收藏下吧,一键三连,非常感谢!

学到这里,今天的世界打烊了,晚安!虽然这篇文章完结了,但是我还在,永不完结。我会努力保持写文章。来日方长,何惧车遥马慢!

感谢各位看到这里!愿你韶华不负,青春无悔!

\