Java学习教程,从入门到精通,Java 捕获和处理多个异常(48)

news2024/12/27 1:59:55

Java学习教程,从入门到精通,Java 捕获和处理多个异常语法知识点及案例代码

在Java中,捕获和处理异常是通过try-catch块来实现的。对于多个异常的处理,你可以在一个try块后面跟多个catch块,每个catch块处理不同类型的异常。此外,你还可以使用Java 7引入的多重捕获语法(在单个catch块中捕获多个异常类型,不过这种语法主要用于简化日志记录等公共处理,而不是处理不同的异常逻辑)。

下面是一个简单而通俗易懂的Java代码示例,展示了如何捕获和处理多个异常:

public class ExceptionHandlingExample {
    public static void main(String[] args) {
        // 调用一个可能抛出异常的方法
        try {
            // 调用一个可能抛出ArithmeticException和NullPointerException的方法
            testExceptions();
        } catch (ArithmeticException e) {
            // 处理ArithmeticException
            System.out.println("捕获到算术异常: " + e.getMessage());
        } catch (NullPointerException e) {
            // 处理NullPointerException
            System.out.println("捕获到空指针异常: " + e.getMessage());
        } catch (Exception e) {
            // 处理所有其他异常类型
            System.out.println("捕获到一般异常: " + e.getMessage());
        } finally {
            // finally块中的代码总是会被执行,无论是否发生异常
            System.out.println("这是finally块,无论是否发生异常都会执行。");
        }
    }

    // 一个示例方法,用于演示抛出不同类型的异常
    public static void testExceptions() throws ArithmeticException, NullPointerException {
        // 示例:抛出ArithmeticException
        int result = 10 / 0;  // 这将抛出ArithmeticException
        System.out.println("结果: " + result);

        // 示例:抛出NullPointerException
        String str = null;
        System.out.println(str.length());  // 这将抛出NullPointerException
    }
}

1.1、代码注释解释:

  1. main方法:程序的入口点。
  2. try块:包含可能抛出异常的代码。
    • testExceptions()方法被调用,该方法可能抛出ArithmeticExceptionNullPointerException
  3. 第一个catch块:捕获并处理ArithmeticException
    • 打印异常信息。
  4. 第二个catch块:捕获并处理NullPointerException
    • 打印异常信息。
  5. 第三个catch块:捕获并处理所有其他异常类型(虽然在这个例子中可能不会用到,但在实际开发中很有用)。
    • 打印异常信息。
  6. finally块:无论是否发生异常,都会执行这个块中的代码。
    • 打印一条消息。

注意事项:

  • finally块是可选的,但非常有用,因为它可以包含清理代码(如关闭文件、释放资源等),这些代码无论是否发生异常都需要执行。
  • 在实际开发中,不要捕获Exception类(或Throwable类),除非你确定需要捕获所有类型的异常。通常最好捕获具体的异常类型,以便进行更精确的处理。
  • 在捕获异常后,可以通过e.getMessage()获取异常的详细信息。

当然可以,以下是一些具体的Java异常处理案例,每个案例都包含了详细的代码注释,以帮助初学者更好地理解异常处理机制。

1.1.1 案例一:文件操作异常处理

import java.io.*;

public class FileOperationExceptionHandling {
    public static void main(String[] args) {
        File file = new File("example.txt");

        // 尝试读取文件内容
        try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
        } catch (FileNotFoundException e) {
            // 处理文件未找到异常
            System.out.println("文件未找到: " + e.getMessage());
        } catch (IOException e) {
            // 处理其他IO异常
            System.out.println("IO异常: " + e.getMessage());
        } finally {
            // 无论是否发生异常,都执行此块(通常用于资源释放)
            System.out.println("文件操作完成,释放资源。");
        }
    }
}

代码注释

  • 尝试使用BufferedReader读取文件内容。
  • try-with-resources语句确保在读取完文件后自动关闭BufferedReader,从而避免资源泄露。
  • catch (FileNotFoundException e)块捕获并处理文件未找到的异常。
  • catch (IOException e)块捕获并处理其他IO异常(如读取错误)。
  • finally块中的代码无论是否发生异常都会执行,通常用于释放资源或执行清理操作。

1.1.2、案例二:数组越界异常处理

public class ArrayIndexOutOfBoundsExceptionHandling {
    public static void main(String[] args) {
        int[] numbers = {1, 2, 3, 4, 5};

        try {
            // 尝试访问数组的一个越界索引
            int number = numbers[10];  // 这将抛出ArrayIndexOutOfBoundsException
        } catch (ArrayIndexOutOfBoundsException e) {
            // 处理数组越界异常
            System.out.println("数组越界: " + e.getMessage());
        } finally {
            // 无论是否发生异常,都执行此块
            System.out.println("数组操作完成。");
        }

        // 正确的数组访问
        try {
            int number = numbers[2];
            System.out.println("数组元素: " + number);
        } catch (ArrayIndexOutOfBoundsException e) {
            // 这个catch块实际上不会执行,因为上面的访问是合法的
            System.out.println("不应该出现的异常: " + e.getMessage());
        }
    }
}

代码注释

  • 尝试访问数组的一个越界索引,这将抛出ArrayIndexOutOfBoundsException
  • catch (ArrayIndexOutOfBoundsException e)块捕获并处理数组越界异常。
  • 第二个try-catch块演示了如何正确地访问数组元素,并说明在这种情况下不会抛出异常。
  • finally块中的代码无论是否发生异常都会执行。

1.1.3、案例三:空指针异常处理

public class NullPointerExceptionHandling {
    public static void main(String[] args) {
        String str = null;

        try {
            // 尝试访问空字符串的长度
            int length = str.length();  // 这将抛出NullPointerException
        } catch (NullPointerException e) {
            // 处理空指针异常
            System.out.println("空指针异常: " + e.getMessage());
        } finally {
            // 无论是否发生异常,都执行此块
            System.out.println("字符串操作完成。");
        }

        // 正确的字符串操作
        try {
            String validStr = "Hello, World!";
            int length = validStr.length();
            System.out.println("字符串长度: " + length);
        } catch (NullPointerException e) {
            // 这个catch块实际上不会执行,因为上面的访问是合法的
            System.out.println("不应该出现的异常: " + e.getMessage());
        }
    }
}

代码注释

  • 尝试访问空字符串的长度,这将抛出NullPointerException
  • catch (NullPointerException e)块捕获并处理空指针异常。
  • 第二个try-catch块演示了如何正确地操作非空字符串,并说明在这种情况下不会抛出异常。
  • finally块中的代码无论是否发生异常都会执行。

这些案例展示了如何在Java中捕获和处理不同类型的异常,以及如何使用try-catch-finally块来确保资源的正确释放和代码的健壮性。希望这些案例能够帮助你更好地理解Java异常处理机制。

当然,以下是一些额外的Java异常处理具体案例,涵盖了网络操作、数据库操作和用户输入等方面的异常处理。

1.1.4、案例四:网络操作异常处理

import java.io.*;
import java.net.*;

public class NetworkOperationExceptionHandling {
    public static void main(String[] args) {
        String urlString = "http://example.com";

        try {
            URL url = new URL(urlString);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();

            try (BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()))) {
                String line;
                while ((line = reader.readLine()) != null) {
                    System.out.println(line);
                }
            } catch (IOException e) {
                // 处理读取网络数据时发生的IO异常
                System.out.println("读取网络数据时发生IO异常: " + e.getMessage());
            }
        } catch (MalformedURLException e) {
            // 处理URL格式错误的异常
            System.out.println("URL格式错误: " + e.getMessage());
        } catch (IOException e) {
            // 处理网络连接或其他IO异常
            System.out.println("网络连接或其他IO异常: " + e.getMessage());
        }

        // 其他代码...
    }
}

代码注释

  • 尝试打开一个网络连接并读取数据。
  • try-with-resources语句确保在读取完数据后自动关闭BufferedReader
  • catch (MalformedURLException e)块捕获并处理URL格式错误的异常。
  • catch (IOException e)块捕获并处理网络连接或其他IO异常(如读取错误)。

1.1.5、案例五:数据库操作异常处理

import java.sql.*;

public class DatabaseOperationExceptionHandling {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/testdb";
        String user = "root";
        String password = "password";

        try (Connection connection = DriverManager.getConnection(url, user, password)) {
            // 假设连接成功,执行查询操作
            String query = "SELECT * FROM users";
            try (Statement statement = connection.createStatement();
                 ResultSet resultSet = statement.executeQuery(query)) {

                while (resultSet.next()) {
                    System.out.println("用户ID: " + resultSet.getInt("id"));
                    System.out.println("用户名: " + resultSet.getString("username"));
                }
            } catch (SQLException e) {
                // 处理查询过程中发生的SQL异常
                System.out.println("查询过程中发生SQL异常: " + e.getMessage());
            }
        } catch (SQLException e) {
            // 处理连接数据库时发生的SQL异常
            System.out.println("连接数据库时发生SQL异常: " + e.getMessage());
        }

        // 其他代码...
    }
}

代码注释

  • 尝试连接到数据库并执行查询操作。
  • try-with-resources语句确保在查询完成后自动关闭StatementResultSet
  • catch (SQLException e)块(在连接部分)捕获并处理连接数据库时发生的SQL异常。
  • catch (SQLException e)块(在查询部分)捕获并处理查询过程中发生的SQL异常。

1.1.6、案例六:用户输入异常处理

import java.util.Scanner;

public class UserInputExceptionHandling {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.print("请输入一个整数: ");
        try {
            int number = Integer.parseInt(scanner.nextLine());
            System.out.println("你输入的整数是: " + number);
        } catch (NumberFormatException e) {
            // 处理用户输入的不是有效整数的情况
            System.out.println("输入的不是有效的整数: " + e.getMessage());
        } finally {
            scanner.close();
            System.out.println("输入操作完成。");
        }

        // 其他代码...
    }
}

代码注释

  • 尝试从用户输入中读取一个整数。
  • try块中的代码尝试将用户输入解析为整数。
  • catch (NumberFormatException e)块捕获并处理用户输入的不是有效整数的情况。
  • finally块中的代码无论是否发生异常都会执行,用于关闭Scanner对象。
    这些案例展示了如何在Java中处理网络操作、数据库操作和用户输入等方面的异常。通过合理地使用try-catch-finally块和异常类型,可以确保程序的健壮性和可靠性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2252871.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

多维数组及其应用————13

1. 二维数组 如果我们把 ⼀维数组做为数组的元 素,这时候就是⼆维数组, ⼆维数组作为数组元素的数组被为三维数组,⼆维数组以上的数组统称 为多维数组。 1.1 二维数组的创建 先行后列 其实也可以这样理解:把二维数组当成特殊的一维…

基于Java Springboot校园导航微信小程序

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse微信开发…

k8s,声明式API对象理解

命令式API 比如: 先kubectl create,再replace的操作,我们称为命令式配置文件操作 kubectl replace的执行过程,是使用新的YAML文件中的API对象,替换原有的API对象;而kubectl apply,则是执行了一…

【北京迅为】iTOP-4412全能版使用手册-第三十五章 WEB控制LED

iTOP-4412全能版采用四核Cortex-A9,主频为1.4GHz-1.6GHz,配备S5M8767 电源管理,集成USB HUB,选用高品质板对板连接器稳定可靠,大厂生产,做工精良。接口一应俱全,开发更简单,搭载全网通4G、支持WIFI、蓝牙、…

轻量的基于图结构的RAG方案LightRAG

LightRAG出自2024年10月的论文《LIGHTRAG: SIMPLE AND FASTRETRIEVAL-AUGMENTED GENERATION》(github),也是使用图结构来索引和搜索相关文本。 LightRAG作者认为已有的RAG系统有如下两个限制,导致难以回答类似"How does the rise of electric vehi…

分布式cap

P(分区安全)都能保证,就是在C(强一致)和A(性能)之间做取舍。 (即立马做主从同步,还是先返回写入结果等会再做主从同步。类似的还有,缓存和db之间的同步。&am…

AD7606使用方法

AD7606是一款8通道最高16位200ksps的AD采样芯片。5V单模拟电源供电,真双极性模拟输入可以选择10 V,5 V两种量程。支持串口与并口两种读取方式。 硬件连接方式: 配置引脚 引脚功能 详细说明 OS2 OS1 OS2 过采样率配置 000 1倍过采样率 …

[VUE]框架网页开发02-如何打包Vue.js框架网页并在服务器中通过Tomcat启动

在现代Web开发中,Vue.js已经成为前端开发的热门选择之一。然而,将Vue.js项目打包并部署到生产环境可能会让一些开发者感到困惑。本文将详细介绍如何将Vue.js项目打包,并通过Tomcat服务器启动运行。 1. 准备工作 确保你的项目能够正常运行,项…

服务器与普通电脑有什么区别?

服务器和普通电脑(通常指的是个人计算机,即PC)有众多相似之处,主要构成包含:CPU,内存,芯片,I/O总线设备,电源,机箱及操作系统软件等,鉴于使用要求…

2.2 线性表的顺序表示

2.2.1 顺序表的定义 一、顺序表的基本概念 线性表的顺序存储又称顺序表。 它是用一组地址连续的存储单元依次存储线性表中的数据元素,从而使得逻辑上相邻的连个元素在物理上也相邻。 第1个元素存储在顺序表的起始位置,第i个元素存储位置后面紧接着存…

游戏引擎学习第30天

仓库: https://gitee.com/mrxiao_com/2d_game 回顾 在这段讨论中,重点是对开发过程中出现的游戏代码进行梳理和进一步优化的过程。 工作回顾:在第30天,回顾了前一天的工作,并提到今天的任务是继续从第29天的代码开始&#xff0c…

探索HarmonyOS:一键掌握Router与NavPathStatck的传参和页面回调技巧

路由的选择 HarmonyOS提供两种路由实现的方式,分别是 Router 和 NavPatchStack。两者使用场景和特效各有优劣。 组件适用场景特点备注Router模块间与模块内页面切换通过每个页面的url实现模块间解耦NavPathStack模块内页面切换通过组件级路由统一路由管理 什么时候使…

每日计划-1203

1. 完成 236. 二叉树的最近公共祖先 ​ /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/ class Solution {public:TreeNode* lowe…

【AI系统】Auto-Tuning 原理

Auto-Tuning 原理 在硬件平台驱动算子运行需要使用各种优化方式来提高性能,然而传统的手工编写算子库面临各种窘境,衍生出了自动生成高性能算子的的方式,称为自动调优。在本文我们首先分析传统算子库面临的挑战,之后介绍基于 TVM…

多组学数据如何发表高分SCI论文,以RNA-Seq数据为例

随着高通量测序以及生物信息学的发展,R语言在生物大数据分析以及数据挖掘中发挥着越来越重要的作用。想要成为一名优秀的生物数据分析者与科研团队不可或缺的人才,除了掌握对生物大数据挖掘与分析技能之外,还要具备一定的统计分析能力与SCI论…

攻防世界-easyupload-新手训练区域

赛前回顾 1.文件上传绕过方式 1.mime:可以通过关闭浏览器js,浏览器f12切断点,burp抓包该文件类型来绕过 2.双写php绕过pphphp或者phpphp 3.使用ptml来绕过,phtml也是通过php来解析的 4..htaccess绕过,这个是apache的解…

位图的学习

一,位图介绍 位图(Bitmap)是一种用于存储图像的方式,它通过二维矩阵(由像素组成)来表示图像的每一个细节。每个像素通常对应一个特定的颜色值,位图的每个“位”就代表了图像的一个像素。 位图…

正则化(Regularization)

正则化(Regularization)是机器学习和统计建模中用来防止过拟合的一种技术。当模型过于复杂,例如拥有过多的参数或层级时,它可能会在训练数据上表现得非常好,但对未见过的数据(即测试数据或真实世界的数据&a…

集成网关 -- 新节点的开发说明

在node-red中,nVisual节点可以帮助我们更快快简捷的完成新的功能,今天我来分享一下关于node-Red中关于nVisual新节点开发基础教程。 首先来看一下基本node-red节点文件目录,当前新开发的7个节点都放在了“node-red\packages\node_modulesno…

小程序入门学习(六)之本地生活案例

效果图如下: 关键代码如下: app.json {"pages": ["pages/home/home","pages/message/message","pages/contact/contact"],"window": {"backgroundTextStyle": "light","n…