Java开发基础系列(十):异常处理

news2024/10/7 4:22:58
😊 @ 作者: 一恍过去
💖 @ 主页: https://blog.csdn.net/zhuocailing3390
🎊 @ 社区: Java技术栈交流
🎉 @ 主题: Java开发基础系列(十):异常处理
⏱️ @ 创作时间: 2023年07月23日

在这里插入图片描述

目录

  • 前言
  • 异常分类
  • 声明异常
  • 抛出异常
  • 捕获异常
    • try-catch
    • try-catch-finally
    • 自动关闭的try-catch

前言

在Java中,异常(Exceptions)是指在程序执行过程中发生的意外或不正常情况。这些异常可能导致程序的正常流程被中断,从而影响程序的执行结果。Java的异常处理机制允许开发者识别、捕获和处理这些异常,以便程序在出现问题时能够进行恰当的应对,而不至于崩溃或产生未知的错误结果。

异常分类

异常主要可以分为两类:可检查异常运行时异常,这两类异常有不同的特性和处理方式。

可检查异常:
可检查异常是指在编译时必须显式处理或声明的异常,也称为受查异常。这些异常通常表示程序在运行过程中可能会遇到外部因素导致的问题,例如文件未找到、网络连接失败等。开发者必须在代码中使用try-catch块或者在方法声明中使用throws关键字来处理这些异常,否则编译器会报错。

  • 常见的可检查异常:
    • IOException:输入输出异常,用于处理文件读写等操作。
    • SQLException:数据库操作异常,用于处理数据库相关错误

运行时异常:
运行时异常是指在编译时不强制要求处理的异常,也称为非检查异常。这些异常通常表示程序逻辑错误或其他不可预知的错误情况,例如除以零、空指针引用等。运行时异常在代码中可以选择性地进行处理,如果没有进行处理,程序将在异常出现时终止并抛出异常信息。

  • 常见的运行时异常:
    • ArithmeticException:算术异常,用于处理算术运算错误,比如除数为零。
    • NullPointerException:空指针异常,用于处理空对象引用导致的错误。
    • ArrayIndexOutOfBoundsException:数组索引越界异常,用于处理数组访问越界错误。
    • IllegalArgumentException:非法参数异常,用于处理传入方法的参数不合法的情况。

声明异常

异常声明指的是在方法中使用throws关键字来声明方法可能抛出的异常类型。当一个方法中可能会抛出检查异常(可检查异常)时,Java要求在方法中显式声明这些异常,以便调用该方法的代码知道可能需要处理这些异常情况。

  • 声明可能抛出的异常
        // 声明可能抛出IOException的方法
        public static void processFile(String filename) throws IOException {
            // 一些可能抛出IOException的代码
        }
    

抛出异常

可以使用throw关键字来手动抛出异常。当程序在运行时遇到异常情况,无法继续正常执行时,可以使用throw语句显式地抛出一个异常对象,以中断当前的程序流程并传递异常信息给上层调用者。

  • 基本语法: `throw 异常对象;

  • 基础示例:

        // 方法中根据输入的值抛出自定义异常
        public static void processInput(int value) {
            if (value < 0) {
                // 抛出IllegalArgumentException异常
                throw new IllegalArgumentException("输入值不能为负数");
            }
        }
    

    processInput方法根据传入的value值来判断是否需要抛出IllegalArgumentException异常。当value为负数时,会使用throw语句抛出自定义异常,并且异常对象中包含了错误信息。

在这里插入图片描述

捕获异常

Java异常捕获的作用在于提高程序的健壮性和稳定性,使程序能够在遇到异常情况时进行适当的处理,而不会因为异常而导致程序崩溃或产生不可预料的结果。

  • 错误处理: 当代码中可能出现异常的情况时,使用异常捕获可以捕获并处理这些异常,避免程序因为异常而停止运行或导致不正确的输出。合理处理异常可以使程序在出现问题时提供友好的错误提示,帮助用户或开发者更好地理解问题。
  • 程序稳定性: 异常捕获保证了程序的稳定性。在出现异常时,程序不会异常终止,而是会根据异常处理逻辑继续执行,使得程序能够正常运行下去。
  • 错误信息传递: 异常捕获可以通过捕获异常对象来获取异常信息,从而更好地理解异常的原因。这些信息对于调试和排除问题非常有用。
  • 资源释放: 在异常处理过程中,可以使用finally代码块确保资源的释放,无论是否发生异常,资源都能得到正确释放。这样可以避免资源泄漏问题,例如关闭文件、数据库连接或网络连接等。
  • 异常链传递: 在处理异常时,可以在catch块中捕获异常后,再通过throw关键字将新的异常抛出,将异常传递给上层调用者。这种方式称为异常链传递,有助于将异常信息传递到合适的地方进行处理。
  • 可读性和维护性: 通过良好的异常处理机制,代码变得更加易读和易于维护。异常捕获可以将异常处理逻辑集中在一处,使代码结构更加清晰。

try-catch

异常捕获是通过使用try-catch块来处理可能会抛出异常的代码。try-catch块允许我们在代码中捕获异常并对其进行处理,以便程序能够在异常发生时继续执行,而不会终止运行。

  • 异常捕获的基本语法:
    try {
        // 可能抛出异常的代码
    } catch (异常类型1 变量名1) {
        // 处理异常类型1的情况
    } catch (异常类型2 变量名2) {
        // 处理异常类型2的情况
    }
    
    • try:包含可能会抛出异常的代码块。
    • catch:用于捕获并处理指定类型的异常。可以有多个catch块,用于处理不同类型的异常。
    • 异常类型:指定要捕获的异常类型。通常是一个异常类或其父类。
    • 变量名:指定捕获到的异常对象的引用变量名,可以在catch块中使用它来获取异常信息。

try{}代码块中,执行正常的业务代码,如果try{}代码块中任意一个行出现异常后,后续业务代码都不会执行,会直接执行catch代码块。
catch代码块中,执行出现异常后的代码逻辑,如果try{}代码块中没有任何异常出现,则不会执行catch代码块。如果存在多个catch时,Java会根据异常的类型自动选择需要执行的catch代码块。

try-catch-finally

finally子句是Java中的一个可选代码块,用于在异常处理结束后执行某些必须执行的代码,无论是否发生异常。不论在try块中是否抛出异常,finally代码块都会被执行,这使得它适用于资源的释放、清理或其他必要的收尾工作。

例如:关闭文件、数据库连接、网络连接或释放其他系统资源。这样,即使在处理异常时出现问题,也能保证资源得到正确地释放,避免资源泄漏。

基本语法:

try {
    // 可能抛出异常的代码
} catch (异常类型 变量名) {
    // 处理异常的代码
} finally {
    // 在异常处理结束后执行的代码块
}

示例:

public class Example {
    public static void main(String[] args) {
        BufferedReader br = null;
        try {
            br = new BufferedReader(new FileReader("example.txt"));
            String line;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
        } catch (FileNotFoundException e) {
            System.err.println("文件未找到:" + e.getMessage());
        } catch (IOException e) {
            System.err.println("读取文件时出现IO异常:" + e.getMessage());
        } finally {
            try {
                if (br != null) {
                    br.close(); // 关闭文件资源
                }
            } catch (IOException e) {
                System.err.println("关闭文件时出现IO异常:" + e.getMessage());
            }
        }
    }
}

自动关闭的try-catch

在Java 7及以后的版本中,引入了自动关闭的try-catch也叫try-with-resources语句,用于自动关闭实现了AutoCloseable接口的资源,例如文件、数据库连接等。这样可以简化代码,并确保资源在代码块执行完毕后自动关闭,无需显式地调用close()方法。

当执行到try块的结尾时,不论是否发生异常,系统都会自动调用资源的close()方法,确保资源得到正确释放。如果在执行close()方法时,又发生了异常,则这个异常将会被抑制,不会影响到主要的异常。

基本语法:

try (资源初始化) {
    // 可能抛出异常的代码
} catch (异常类型 变量名) {
    // 处理异常的代码
}
  • 资源初始化:在这里初始化需要自动关闭的资源,这个资源必须实现AutoCloseable接口,该接口中定义了close()方法。
  • try:包含可能会抛出异常的代码块。
  • catch:用于捕获并处理指定类型的异常。

示例:
在上面try-catch-finally的案例中,我们通过finally子语句来实现BufferedReader资源的关闭,那么使用自动关闭的try-catch的方式如下:

public class Example {
    public static void main(String[] args) {
        try (BufferedReader br = new BufferedReader(new FileReader("example.txt"))) {
            String line;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
        } catch (FileNotFoundException e) {
            System.err.println("文件未找到:" + e.getMessage());
        } catch (IOException e) {
            System.err.println("读取文件时出现IO异常:" + e.getMessage());
        }
    }
}

我们使用了自动关闭的try-catch语句来读取文件内容。在try块中,我们初始化了BufferedReader资源,用于读取文件内容。在代码块执行完毕后,无需手动调用close()方法,系统会自动关闭BufferedReader资源,确保文件得到正确关闭。

在这里插入图片描述

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

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

相关文章

深度学习——生成对抗网络GAN

基本概念 概述 GAN是一种深度学习模型&#xff0c;它是一种无监督学习算法&#xff0c;用于从随机噪声中生成逼真的数据&#xff0c;比如图像、音频、文本等。GAN的结构由两个神经网络组成&#xff1a;生成器&#xff08;Generator&#xff09;和判别器&#xff08;Discrimin…

谈谈面试大厂中碰到的问题

面试IT公司的小技巧 非常不建议在简历上造假&#xff0c;简历上能起到关键作用、有分量的部分&#xff0c;别人都是有办法去核实的&#xff0c;比如教育背景、关键性的证书、奖项等&#xff1b;核实不了的&#xff0c;又基本上也对结果产生不了太大影响&#xff0c;又何必去画…

USG6000v防火墙的基本使用:制定安全策略让不同安全区域的设备进行访问

目录 一、首先配置环境&#xff1a; 二、实验拓扑及说明 拓扑&#xff1a; PC1和PC2配置ip地址&#xff1a;​编辑​编辑 r4路由器配置ip&#xff1a; 进行防火墙的设置&#xff1a; 1、创建trust1区域和untrust1区域 2、制定防火墙的策略&#xff1a; 3、为防火墙增加可以…

【PostgreSQL内核学习(四)—— 查询规划】

查询规划 查询规划总体处理流程pg_plan_queries函数standard_planner函数subquery_planner函数inheritance_planner函数grouping_planner函数 总结 声明&#xff1a;本文的部分内容参考了他人的文章。在编写过程中&#xff0c;我们尊重他人的知识产权和学术成果&#xff0c;力求…

SpringBoot原理分析 | 任务:异步、邮件、定时

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; 任务 异步任务 Java异步指的是在程序执行过程中&#xff0c;某些任务可以在后台进行&#xff0c;而不会阻塞程序的执行。通常情况下&#xff0c;Java异步使用线程池来…

Apikit 自学日记:如何使用定时执行测试用例功能呢?

API自动化测试其实可以设置定时任务&#xff0c;实现项目在无人值守的情况下自动测试并且发送报告给相应的邮箱&#xff0c;监控项目监控情况。 这样一来&#xff0c;就能大大提高工作效率。 目前在 APIkit中这一部分主要功能有&#xff1a; 1.允许对测试任务进行分组&#xf…

Llama 2: Open Foundation and Fine-Tuned Chat Models

文章目录 TL;DRIntroduction背景本文方案 实现方式预训练预训练数据训练细节训练硬件支持预训练碳足迹 微调SFTSFT 训练细节 RLHF人类偏好数据收集奖励模型迭代式微调&#xff08;RLHF&#xff09;拒绝采样&#xff08;Rejection Sampling&#xff09;PPO多轮一致性的系统消息&…

GAMS---典型优化模型和算法介绍、GAMS安装和介绍、GAMS程序编写、GAMS程序调试、实际应用算例演示与经验分享

优化分析是很多领域中都要面临的一个重要问题&#xff0c;求解优化问题的一般做法是&#xff1a;建立模型、编写算法、求解计算。常见的问题类型有线性规划、非线性规划、混合整数规划、混合整数非线性规划、二次规划等&#xff0c;优化算法包括人工智能算法和内点法等数学类优…

S32K144 GPIO外设分析

1. S32K144 GPIO外设特性 下面的内容来自于S32K用户手册的翻译&#xff0c;或者网上关于S32K系列的一些pdf文件介绍。有些内容可能会出现理解不到位或者翻译错误方面&#xff0c;如果大家有疑问最好可以查阅用户手册。 GPIO和PORT的数量 从用户手册&#xff0c;对于PCR&#x…

python try/except/finally

稍微总结一下&#xff0c;否则总是忘。 x abc def fetcher(obj, index): return obj[index] fetcher(x, 4) 输出&#xff1a; File "test.py", line 6, in <module> fetcher(x, 4) File "test.py", line 4, in fetcher return obj[index] …

实验四 回溯法

实验四 回溯法 售货员问题 1.实验内容 1、理解回溯法的深度优先搜索策略&#xff0c;掌握用回溯法解题的算法框架 2、设计并实现旅行售货员问题问题&#xff0c;掌握回溯算法。 2.实验环境 Java 3.问题描述 旅行售货员问题&#xff1a;设有一个售货员从城市1出发&#…

docker-compose自建RustDesk远程控制服务器

github&#xff1a; rustdesk/rustdesk-server: RustDesk Server Program (github.com) 一、创建 docker-compose.yml 文件&#xff0c;复制以下 docker-compose 配置文件内容到文件 version: 3networks:rustdesk-net:external: falseservices:hbbs:container_name: hbbspor…

开源ThinkMusic搭建音乐网站,并实现公网连接

1、前言 在我们的日常生活中&#xff0c;音乐已经成为不可或缺的要素之一&#xff0c;听几首喜欢的音乐&#xff0c;能让原本糟糕的心情变得好起来。虽然现在使用电脑或移动电子设备听歌都很方便&#xff0c;但难免受到诸多会员或VIP限制&#xff0c;难免让我们回想起音乐网站…

DAY6,C++(将顺序栈,顺序循环队列定义成模板类);

1.将顺序栈定义成模板类&#xff1b;​​​​​​ 顺序栈模板代码--- #include <iostream>using namespace std;template<typename T> class Stack { private:T *data; //指向堆区空间int top; //记录栈顶位置public:Stack(); //无参构造Stack(T size); //有…

子网划分路由网卡安全组

1."IPv4 CIDR" "IPv4 CIDR" 是与互联网协议地址&#xff08;IP address&#xff09;和网络的子网划分有关的概念。 - "IPv4" 代表 "Internet Protocol version 4"&#xff0c;也就是第四版互联网协议&#xff0c;这是互联网上最广泛使…

动态规划入门第4课,经典DP问题3 ----公共最长子序列

练习 第1题 最长公共子串 查看测评数据信息 给出2个小写字母组成的字符串&#xff0c;求它们最长的公共子串的长度是多少&#xff1f; 例如&#xff1a;”abcdefg” 与”xydoeagab”。有最长的公共子串”deg”&#xff0c; 答案为&#xff1a;3。 输入格式 第一行&#xff…

Java并发编程学习笔记(一)线程的入门与创建

一、进程与线程 认识 程序由指令和数据组成&#xff0c;简单来说&#xff0c;进程可以视为程序的一个实例 大部分程序可以同时运行多个实例进程&#xff0c;例如记事本、画图、浏览器等少部分程序只能同时运行一个实例进程&#xff0c;例如QQ音乐、网易云音乐等 一个进程可以…

【密码学】三、DES

DES 1、DES的加密过程2、初始置换3、16轮迭代变换过程3.1 扩展变换/位选择函数E3.2 S盒代换3.3P盒置换 4、初始逆置换5、密钥扩展5.1 选择置换PC_15.2选择置换PC_2 6、DES的解密过程7、多重DES 美国正式公布实施的DES是一个众所周知的分组密码&#xff0c;其 分组长度是64bit&…

Redis 缓存机制介绍

.Redis 缓存 缓存&#xff08;cache&#xff09;&#xff0c;原始意义是指访问速度比一般随机存取存储器&#xff08;RAM&#xff09;快的一种高速存储器&#xff0c;通常它不像系统主存那样使用 DRAM 技术&#xff0c;而使用昂贵但较快速的 SRAM 技术。缓存的设置是所有现代计…

arm点灯

.text .global _start _start: /**********LED1点灯**************/RCC_INIT:LDR R0,0X50000A28LDR R1,[R0]orr R1,R1,#(0x1<<4)orr R1,R1,#(0X1<<5)STR R1,[R0] LED1_INIT:/**/LDR R0,0X50006000LDR R1,[R0]and R1,R1,#(~(0X3<<20))orr R1,R1,#(0x1<<…