• Java异常被抛出或被捕获之后,代码是否继续执行的问题


    在写程序的时候,我们经常被教导,要对异常的信息进行处理,哪里该抛出异常。但是,更多的时候,我们只是模仿异常的抛出,却不知道为什么要这样抛异常(被catch了?被向上抛了?后面的代码是否执行了?)。

    接下来,我就简单的说一下异常抛出后的代码执行问题。此处不讨论自定义异常,因为自定义异常有自己的处理方式。

    一、结论:

    1. 凡是有异常的地方,需要有处理异常的地方。(示例:Demo1, Demo2)
    2. 只要异常被处理,异常处理之后的代码都可以正常执行。(示例:Demo1, Demo2)
    3. 异常被往上抛出,则抛出异常之后的代码将不被执行。(示例:Demo2, Demo3)

    二、示例代码

    接下来用两段代码来说明异常抛出后代码执行的顺序

    **示例1. **

    Demo1.java

    /**
     * 抛出异常的代码是放在 try 中
     */
    public class Demo1 {
        public static void main(String[] args) {
            try {
                print();
                Thread.sleep(200);
            } catch (Exception e) {
                e.printStackTrace();
                System.out.println("打印抛出异常");
            }
            System.out.println("程序结束");
        }
    
        private static void print() {
            int index = 0;
            while (index < 15) {
                try {
                    Thread.sleep(200);
                    ++index;
                    if (index == 5 || index == 10) {
                        throw new Exception();
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    System.out.println("循环抛出异常");
                }
                System.out.println("index = " + index);
            }
            System.out.println("循环结束");
        }
    }
    

    运行结果:

    index = 1
    index = 2
    index = 3
    index = 4
    java.lang.Exception
    循环抛出异常
    index = 5
    	at com.example.demo.Demo1.print(Demo1.java:22)
    	at com.example.demo.Demo1.main(Demo1.java:6)
    index = 6
    index = 7
    index = 8
    index = 9
    java.lang.Exception
    	at com.example.demo.Demo1.print(Demo1.java:22)
    	at com.example.demo.Demo1.main(Demo1.java:6)
    循环抛出异常
    index = 10
    index = 11
    index = 12
    index = 13
    index = 14
    index = 15
    循环结束
    程序结束
    

    **示例2. **

    Demo2.java

    /**
     * 抛出异常的代码是放在 try 外
     */
    public class Demo2 {
        public static void main(String[] args) {
            try {
                print();
                Thread.sleep(200);
            } catch (Exception e) {
                e.printStackTrace();
                System.out.println("打印抛出异常");
            }
            System.out.println("程序结束");
        }
    
        private static void print() throws Exception{
            int index = 0;
            while (index < 15){
                if (index == 5 || index == 10){
                    throw new Exception();
                }
                try {
                    Thread.sleep(200);
                    ++index;
                } catch (Exception e) {
                    e.printStackTrace();
                    System.out.println("循环抛出异常");
                }
                System.out.println("index = "+index);
            }
            System.out.println("循环结束");
        }
    }
    

    运行结果

    index = 1
    index = 2
    index = 3
    index = 4
    index = 5
    java.lang.Exception
    	at com.example.demo.Demo2.print(Demo2.java:19)
    	at com.example.demo.Demo2.main(Demo2.java:6)
    打印抛出异常
    程序结束
    
    

    **示例3. **

    Demo3.java

    /**
     * 不对异常进行捕获,只是往上抛
     */
    public class Demo3 {
        public static void main(String[] args) throws Exception {
            print();
            System.out.println("程序结束");
        }
    
        private static void print() throws Exception {
            int index = 0;
            while (index < 15){
                ++index;
                if (index == 5 || index == 10){
                    throw new Exception();
                }
                System.out.println("index = "+index);
            }
            System.out.println("循环结束");
        }
    }
    
    

    运行结果

    index = 1
    index = 2
    index = 3
    index = 4
    Exception in thread "main" java.lang.Exception
    	at com.example.demo.Demo3.print(Demo3.java:15)
    	at com.example.demo.Demo3.main(Demo3.java:5)
    

    三、分析

    Demo1 与 Demo2 的区别在于抛出异常的代码是放在 try 中,还是放在 try 外。

    //抛出异常的代码
    if (index == 5 || index == 10){
        throw new Exception();
    }
    

    分析:Demo1

    1. print 方法没有往 main 方法抛出异常,而是在循环中直接 catch 异常。
    2. 异常被 catch 之后,循环继续执行。
    3. 在 print 方法执行结束之后,因为 main 方法没有出现任何异常,print 方法之后的代码都能正常执行。

    分析:Demo2

    1. print 方法往 main 方法抛出异常。
    2. 循环在异常出现的时候,循环将不再执行,异常被抛出到 main 方法中。
    3. main 方法 catch 异常,异常在 catch 被处理之后,catch 之后的代码都能正常执行。

    分析:Demo3

    1. print 方法往 main 方法抛出异常。循环在异常出现的时候,循环将不再执行,异常被抛出到 main 方法中。
    2. main 方法往上继续抛出异常。在 print 出现异常的时候,print 之后的代码将不再执行。

    如果文章有帮助到了你,欢迎点赞、转发。

    如果文章有错误的地方,欢迎留言交流。

  • 相关阅读:
    @Aspect 注解使用详解
    Mysql的4个隔离级别
    【学习笔记】二分类问题中的“最大似然”与“交叉熵损失”概念的理解
    【转】对“先验概率”与“后验概率”概念的通俗理解
    nginx——安装部署vue项目
    JWT
    Vue——自定义组件实现vmodel
    Vue——子级向父级传递参数
    SpringBoot2(十四)全局异常切面
    Vue——ElementUI表格分页
  • 原文地址:https://www.cnblogs.com/zhenggc/p/13655498.html
Copyright © 2020-2023  润新知