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

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

在写程序的时候,我们经常被教导,要对异常的信息进行处理,哪里该抛出异常。但是,更多的时候,我们只是模仿异常的抛出,却不知道为什么要这样抛异常(被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 之后的代码将不再执行。

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

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

相关文章
|
10月前
|
Java 开发工具
【Azure Storage Account】Java Code访问Storage Account File Share的上传和下载代码示例
本文介绍如何使用Java通过azure-storage-file-share SDK实现Azure文件共享的上传下载。包含依赖引入、客户端创建及完整示例代码,助你快速集成Azure File Share功能。
653 6
|
10月前
|
Java 数据处理 API
为什么你的Java代码应该多用Stream?从循环到声明式的思维转变
为什么你的Java代码应该多用Stream?从循环到声明式的思维转变
422 115
|
10月前
|
安全 Java 编译器
为什么你的Java代码需要泛型?类型安全的艺术
为什么你的Java代码需要泛型?类型安全的艺术
322 98
|
10月前
|
Java 编译器 API
java最新版和java8的区别,用代码展示
java最新版和java8的区别,用代码展示
738 43
|
10月前
|
安全 Java 容器
告别空指针噩梦:Optional让Java代码更优雅
告别空指针噩梦:Optional让Java代码更优雅
570 94
|
10月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
480 1
|
10月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
438 1
|
11月前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
Java 数据库 Spring
472 0
|
11月前
|
算法 Java
Java多线程编程:实现线程间数据共享机制
以上就是Java中几种主要处理多线程序列化资源以及协调各自独立运行但需相互配合以完成任务threads 的技术手段与策略。正确应用上述技术将大大增强你程序稳定性与效率同时也降低bug出现率因此深刻理解每项技术背后理论至关重要.
657 16