JAVA中的异常处理

2023-10-26

一、什么是异常?

异常是指在程序执行过程中出现的错误或异常情况。它可能是由于错误的输入、无效的操作、资源不可用等原因引起的。当程序遇到异常时,它会中断当前的执行路径,并转到能够处理该异常的代码块。

在 Java 中,异常是以对象的形式表示的,它们属于 Throwable 类或其子类的实例。Java 中的异常分为两种类型:

1、可检查异常(Checked Exception):这些异常在编译时就被检查到,要求在代码中进行处理或声明抛出。可检查异常主要用于表示外部环境可能发生的问题,如文件操作、网络连接等。开发人员必须显式地处理这些异常或将其传播给调用者。常见的可检查异常包括 IOExceptionSQLException 等。

2、运行时异常(Runtime Exception):这些异常在运行时才会被抛出,不需要在代码中显式地进行处理或声明抛出。运行时异常通常由程序错误或错误的使用造成,如空指针引用、数组越界等。它们不要求进行强制性的处理,但良好的编程实践建议尽量避免运行时异常的发生。常见的运行时异常包括 NullPointerExceptionArrayIndexOutOfBoundsException 等。

二、异常处理

在 Java 中,我们使用以下关键字来处理异常:

try:用于定义一个代码块,其中包含可能抛出异常的代码。

catch:用于捕获并处理指定类型的异常。

finally:用于定义一个代码块,无论是否发生异常都会执行其中的代码。

throw:用于手动抛出一个异常。

下面是一个简单的代码示例,展示了异常处理的基本用法:

public class ExceptionHandlingExample {
    public static void main(String[] args) {
        try {
            // 可能抛出异常的代码块
            int result = divide(10, 0);
            System.out.println("结果:" + result);
        } catch (ArithmeticException e) {
            // 捕获并处理指定类型的异常
            System.out.println("除零错误:" + e.getMessage());
        } finally {
            // 无论是否发生异常,都会执行的代码块
            System.out.println("异常处理完成。");
        }
    }

    public static int divide(int dividend, int divisor) {
        // 手动抛出异常
        if (divisor == 0) {
            throw new ArithmeticException("除数不能为零。");
        }
        return dividend / divisor;
    }
}

在上面的示例中,divide() 方法可能抛出 ArithmeticException 异常,当除数为零时,我们手动抛出该异常。在 main() 方法中,我们使用 try-catch 块来捕获并处理这个异常。无论是否发生异常,finally 块中的代码都会执行。

三、自定义异常

除了使用 Java 标准库中定义的异常类,我们还可以自定义异常类来表示特定的错误或异常情况。自定义异常类通常继承自 Exception 或其子类,以便与其他异常区分开来。

以下是一个自定义异常类的示例:


public class MyException extends Exception {
    private String message;
    public MyException(){
        super();
    }
    public MyException(String message){
        super(message);
    }
}

在这个示例中,MyException类继承自Exception类,并包含两个构造方法,一个无参构造方法和一个带有异常消息的有参构造方法。

接下来是TestException类,其中的test()方法声明了throws MyException,表示该方法可能会抛出MyException异常。在test()方法中,我们打印一条消息,并使用throw关键字抛出一个MyException异常,同时传入异常消息。

public class TestException {
    public  void test()throws MyException {
       System.out.println("有错误吗");
       throw new MyException("哎呀,出错了!");
    }
}

test()方法中,我们打印一条消息,并抛出一个MyException.

最后是主类Test,在该类的main方法中,我们创建一个TestException对象,并调用其test()方法。由于test()方法声明了throws MyException,我们需要在main方法的签名中使用throws MyException来处理可能抛出的异常。在异常被抛出时,程序会打印相应的异常消息。

public class Test {
    public static void main(String[] args) throws MyException {
        System.out.println("今天是个好日子");
        TestException ex=new TestException();
        ex.test();
    }
}

改代码运行如下:

今天是个好日子
有错误吗
Exception in thread "main" Studying.MyException: 哎呀,出错了!
	at Studying.TestException.test(TestException.java:6)
	at Studying.Test.main(Test.java:7)

或者也可以使用RuntimeException,将TestException类和主类Test改为如下:

public class TestException {
    public  void test() {
       System.out.println("有错误吗");
       throw new RuntimeException();
    }
}
public class Test {
    public static void main(String[] args) throws MyException {
        System.out.println("今天是个好日子");
        TestException ex = new TestException();
        try {
            ex.test();
        } catch (RuntimeException e) {
            System.out.println("捕获到运行时异常");
        }
    }
}

这样也能正常运行,运行结果如下:

今天是个好日子
有错误吗
捕获到运行时异常

Process finished with exit code 0

由于test()方法会抛出RuntimeException,我们使用try-catch语句来捕获并处理这个异常。在异常被捕获时,会打印一条相应的消息。

通过这个示例,我们展示了自定义异常和异常处理的基本用法。自定义异常可以根据需要定义特定的异常类型,而异常处理可以帮助我们捕获并处理可能出现的异常情况,以确保程序的健壮性和稳定性。

四、抛出的是机器出错的结果吗?

当程序执行过程中发生异常,抛出异常会导致程序流程的跳转,进入异常处理的阶段。这样可以提前检测到错误或异常情况,并采取相应的措施来处理或修复问题,以避免后续代码执行时出现更严重的错误或不一致性。

简单理解为:其实这个异常抛出的机制类似于电路系统中的保险丝,在电路快短路的时候,有保险丝的存在,将保险丝熔断后,就能很好的保护电路,所以这个异常抛出的机制是在一些问题的发生前停止整个程序。不然当电路短路烧完后再有一个保险丝,显然是起不到任何作用。类似地,异常抛出机制也是在程序执行过程中遇到问题时,通过抛出异常来中断程序的正常执行,以保护程序的完整性和稳定性。

而抛出的异常其实是指通过throw语句显式地抛出的异常对象。异常对象是Exception类或其子类的实例,它封装了关于出现问题的详细信息。异常对象通常包含异常的类型、消息、堆栈轨迹等信息,以便在异常处理过程中进行识别和处理。

五、小结

异常处理是编程中必不可少的一部分,它可以帮助我们检测和处理可能出现的错误和异常情况。通过使用 try-catch-finally 块和相关的关键字,我们可以优雅地处理异常,并保证程序的稳定性和可靠性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JAVA中的异常处理 的相关文章

随机推荐

  • 曾经被视为「牛市制造机」们的机构巨鲸,如今都怎么了?

    这是白话区块链的第1790期原创 作者 Terry出品 白话区块链 ID hellobtc 11 月 17 日 萨尔瓦多总统 Nayib Bukele 表示 从明天开始 我们将每天购买一个比特币 直接开始了国家级别的比特币定投之旅 相信不少
  • 【图片二值化处理,以及byte[] 与bitmap互相转化问题】

    1 byte与bitmap相互转换 将byte流转换为bitmap byte signature item ToArray MemoryStream ms1 new MemoryStream signature Bitmap bm Bitm
  • 打开ABAQUS时,显示找不到 MFC140U.DLL 文件,打不开软件,亲测解决

    打开ABAQUS时 显示找不到 MFC140U DLL 文件 打不开软件 如何解决 下载了X64版本的 安装完毕后就可以打开了 Microsoft Visual C 2017 Redistributable 32位链接 link 64位链接
  • 时钟同步-注意客户端和服务端都需要开启123端口 udp协议

    确认时钟源 chronyc sources v chronyc tracking Linux Chronyd时间同步服务器详解 wangjie722703的博客 CSDN博客 local stratum 10 即使自己未能通过网络时间服务器
  • pytorch-lightning如何设置训练epoch

    Trainer初始化时添加max epochs参数 init model autoencoder LitAutoEncoder trainer pl Trainer gpus 8 max epochs 50 trainer fit auto
  • iOS uiscrollView 嵌套 问题 的解决

    苹果官方文档里面提过 最好不要嵌套scrollView 特别提过UITableView和UIWebView 因为在滑动时 无法知道到底是希望superScrollView滑动还是subScrollView滑动 一旦出现这种情况 情况就出乎我
  • 一文了解websocket全双工通信java实现&socket地址404问题解决

    websocket介绍 1 websocket介绍 1 1注解介绍 2 demo 2 1 后端代码 2 2 前端代码 2 3 效果 附录 socket地址404问题解决 1 websocket介绍 WebSocket是一种在单个TCP连接上
  • 背包问题

    一 01背包 题目 有一个容量为T的背包 现有n个物品 每个物品有都有一个体积w i 和自身价值v i 现在要求求出背包能够装的物品的价值最大 每个物品只可以装一次 基本思路 01背包是背包中的最基础的问题 后面很多背包问题都是01背包和完
  • [会议分享]2022年欧洲计算机科学与信息技术会议(ECCSIT 2022)

    2022年欧洲计算机科学与信息技术会议 ECCSIT 2022 重要信息 会议网址 www eccsit org 会议时间 2022年11月25 27日 召开地点 南京 截稿时间 2022年10月20日 录用通知 投稿后2周内 收录检索 E
  • 【DevOps核心理念基础】3. 敏捷开发最佳实践

    一 敏捷开发最佳实践 1 1 项目管理 1 2 需求管理 1 3 技术架构 1 4 技术开发 1 5 测试 二 敏捷开发最佳实践 2 1 敏捷开发的执行细节 三 全面的DevOps工具链 四 版本控制和协作开发工具 4 1 集中式版本控制工
  • SX1281驱动学习笔记一:Lora驱动移植

    目录 一 资料下载 1 中文手册下载地址 2 英文手册下载地址 3 固件下载地址 4 SX1281的速率计算器下载地址 5 SX128X区别 二 驱动讲解 1 radio h文件 2 sx1281 c文件 3 sx1281 hal c文件
  • unity在同屏幕显示多Camera并在脚本中修改Viewport Rece

    参考 https www it610 com article 1305219586412548096 htm 参考 https www zhihu com question 41879088 sort created 修改Camera的Vi
  • 开放平台认证方案

    背景 本次的直接起因是第三方那边接入系统后端引起的 第三方方觉得认证要过期比较麻烦 而且要用账号密码去调登录接口去刷token 设计不合理 客观来说 凭本人使用过其它开放平台来说确实有些不一样 常见的一些开放平台 有带web的 一般web能
  • 感知机及算法实现

    1 感知机二类分类的线性分类模型 输入为实例的特征向量 输出为实例的类别 取 1和 1二值 感知机对应于输入空间中将实例划分为正负两类的分离超平面 属于判别模型 感知机学习旨在求出将训练数据进行线性划分的分离超平面 为此导入基于误分类的损失
  • error: use of deleted function

    本文案例仅供参考 出错的代码如下 TEST Test test1 TestImpl impl TestImpl para1 para2 ASSERT EQ jkj impl func 22 33 44 实际应该这样 TEST Test te
  • PyCharm下载包出错

    PyCharm安装成功之后添加所需的包 File gt Settings gt Project 此处是你的Python工作环境 gt Project Interpreter 红色剪头所指 添加需要的包 点开时候出现错误信息 Error lo
  • phpstorm运行php出现502 Bad Gateway

    个人博客开通啦 功能正在逐步完善中 大家可以访问http www codeliu com 记一次心碎的经历 我用的phpstorm10 0 1 XAMPP 今天写完一个php文件后 运行出现502 Bad Gateway的错误 明明上一刻还
  • c语言中的常见数据类型

    一 常见的数据类型包括基本类型 枚举类型 空类型和派生类型 基本类型又包括整型类型 浮点类型 整型类型 基本类型 int 短整型 short int 长整型 long int 双长整型 long long int 字符型 char 布尔型
  • 判断一个字符是否是十六进制

    判断一个字符是否是十六进制 十六进制 hexadecimal 是计算机中数据的一种表示方法 意思是逢十六进一 十六进制数以16为基数 采用的数码是0 1 2 3 4 5 6 7 8 9 A B C D E F 其中A F分别表示十进制数字1
  • JAVA中的异常处理

    一 什么是异常 异常是指在程序执行过程中出现的错误或异常情况 它可能是由于错误的输入 无效的操作 资源不可用等原因引起的 当程序遇到异常时 它会中断当前的执行路径 并转到能够处理该异常的代码块 在 Java 中 异常是以对象的形式表示的 它