【JAVA进阶】异常处理

news2025/2/24 4:22:07

📃个人主页:个人主页

🔥系列专栏:JAVASE基础

目录

1.异常概述、体系

2.常见运行时异常

3.常见编译时异常

4.异常的默认处理流程

5.编译时异常的处理机制

6.运行时异常的处理机制

7.finally

8.自定义异常


1.异常概述、体系

什么是异常?

  • 异常是程序在“编译”或者“执行”的过程中可能出现的问题,注意:语法错误不算在异常体系中。
  • 比如:数组索引越界、空指针异常、 日期格式化异常,等…

为什么要学习异常?

  • 异常一旦出现了,如果没有提前处理,程序就会退出JVM虚拟机而终止.
  • 研究异常并且避免异常,然后提前处理异常,体现的是程序的安全, 健壮性。

异常体系

Error: 系统级别问题、JVM退出等,代码无法控制。

Exception:java.lang包下,称为异常类,它表示程序本身可以处理的问题

  • RuntimeException及其子类:运行时异常,编译阶段不会报错。 (空指针异常,数组索引越界异常)
  • 除RuntimeException之外所有的异常:编译时异常,编译期必须处理的,否则程序不能通过编译。 (日期格式化异常)。

编译时异常和运行时异常

 简单来说:

  • 编译时异常就是在编译的时候出现的异常
  •  运行时异常就是在运行时出现的异常。

2.常见运行时异常

直接继承自RuntimeException或者其子类,编译阶段不会报错,运行时可能出现的错误。

常见的运行时异常包括:

  1. NullPointerException(空指针异常):当试图访问一个空对象的方法或属性时,抛出该异常。

  2. ArrayIndexOutOfBoundsException(数组下标越界异常):当尝试访问数组中不存在的索引位置时,抛出该异常。

  3. ClassCastException(类型转换异常):当试图将一个对象强制转换为不相关的类时,抛出该异常。

  4. IllegalArgumentException(非法参数异常):当提供的参数不符合方法的预期时,抛出该异常。

  5. ArithmeticException(算术异常):当出现除以零等算术错误时,抛出该异常。

  6. IndexOutOfBoundsException(索引越界异常):当访问某个实现了索引接口的对象时,访问了超出其范围的索引位置,抛出该异常。

  7. SecurityException(安全异常):当试图执行非法操作时,如访问受保护的资源或从安全管理器中请求不被允许的权限,抛出该异常。

  8. ConcurrentModificationException(并发修改异常):当在迭代器遍历集合的同时,集合被修改时,抛出该异常。

  9. OutOfMemoryError(内存不足异常):当没有足够的内存可用时,抛出该异常。

运行时异常:一般是程序员业务没有考虑好或者是编程逻辑不严谨引起的程序错误, 自己的水平有问题!

3.常见编译时异常

不是RuntimeException或者其子类的异常,编译阶就报错,必须处理,否则代码不通过。

编译时异常示例

编译时异常的作用是什么:

  • 是担心程序员的技术不行,在编译阶段就爆出一个错误, 目的在于提醒不要出错!
  • 编译时异常是可遇不可求。遇到了就遇到了呗。

编译时异常的特点

  • 编译时异常:继承自Exception的异常或者其子类
  • 编译阶段报错,必须处理,否则代码不通过。

Java 常见的编译时异常包括:

  1. FileNotFoundException:表示指定的文件不存在。

  2. IOException:表示输入/输出操作失败或被中断。

  3. ClassNotFoundException:表示无法找到类。

  4. NoSuchMethodException:表示调用了不存在的方法。

  5. NoSuchFieldException:表示访问了不存在的字段。

  6. IllegalAccessException:表示试图访问私有字段或方法。

  7. IllegalArgumentException:表示传递给方法的参数不合法。

  8. NullPointerException:表示试图访问空对象引用。

  9. ArrayIndexOutOfBoundsException:表示访问数组越界。

  10. InterruptedException:表示线程被中断。

4.异常的默认处理流程

  1. 默认会在出现异常的代码那里自动的创建一个异常对象:ArithmeticException。
  2. 异常会从方法中出现的点这里抛出给调用者,调用者最终抛出给JVM虚拟机。
  3. 虚拟机接收到异常对象后,先在控制台直接输出异常栈信息数据。
  4. 直接从当前执行的异常点干掉当前程序。
  5. 后续代码没有机会执行了,因为程序已经死亡。
public class test {
    public static void main(String[] args) {
        System.out.println("程序开始。。。。");
        chu(10,0);


        System.out.println("程序结束。。。。");
    }

    private static void chu(int a, int b) {
        System.out.println(a);
        System.out.println(b);
        int c=a/b;
        System.out.println("结果是"+c);
    }
}

默认的异常处理机制并不好,一旦真的出现异常,程序立即死亡!

5.编译时异常的处理机制

编译时异常是编译阶段就出错的,所以必须处理,否则代码根本无法通过

1.抛出异常

编译时异常可以通过在方法声明中使用“throws”关键字抛出给调用方,在调用方处进行处理。如果调用方未能捕获该异常,则必须将异常向上抛出,直到被捕获或程序终止。

例如:

public static void main(String[] args) throws IOException {
   BufferedReader br = new BufferedReader(new FileReader("file.txt"));
   String line = br.readLine();
   System.out.println(line);
}

在以上代码中,读取文件时可能会发生IOException异常,因此我们将其抛出给main方法的调用方进行处理。

2.捕获异常并处理

  • 监视捕获异常,用在方法内部,可以将方法内部出现的异常直接捕获处理。
  • 这种方式还可以,发生异常的方法自己独立完成异常的处理,程序可以继续往下执行。

例如:

public static void main(String[] args) {
   try {
      BufferedReader br = new BufferedReader(new FileReader("file.txt"));
      String line = br.readLine();
      System.out.println(line);
   } catch (IOException e) {
      System.out.println("文件读取失败!");
      e.printStackTrace();
   }
}

在以上代码中,我们使用try-catch语句捕获了IOException异常,并在catch块中输出了错误信息。

总之,编译时异常的处理方式取决于异常的类型和代码实现的需求。通常,我们应该遵循“抛出异常而不是吞噬异常”的原则,以确保代码的健壮性和可维护性。

6.运行时异常的处理机制

Java运行时异常是指在程序运行期间发生的异常,它们通常与程序员编写的代码有关,如除以零、数组越界、空指针引用等。与受检异常不同,运行时异常可以不用显式地在方法签名或调用处进行声明或处理。

在Java中,运行时异常的处理机制是通过try-catch语句来捕获并处理异常。当运行时异常发生时,程序会跳转到与异常匹配的catch块中,并执行其中的代码。如果没有匹配的catch块,程序会终止并打印出异常信息。

以下是一个示例代码,演示了如何捕获并处理运行时异常:

public class Example {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3};
        try {
            int num = arr[3]; // 数组越界,抛出ArrayIndexOutOfBoundsException
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("数组越界异常:" + e.getMessage());
        }
    }
}

在上述示例中,当程序尝试访问索引为3的数组元素时,会发生数组越界异常,抛出ArrayIndexOutOfBoundsException。由于在try块中捕获了该异常,程序会跳转到catch块中,并输出异常信息。

总而言之,Java提供了try-catch语句来捕获和处理运行时异常,程序员可以根据自己的需要选择是否处理这些异常。但应该注意,过多地捕获和处理异常会影响程序的性能和可读性,应该谨慎处理。

7.finally

"finally"是Java中的一种关键字。它是一个可选的代码块,在try-catch语句块中使用,无论是否发生异常,都会执行。"finally"用于确保有些代码需要在异常情况下被执行,如关闭文件或释放资源等。例如:

try {
   // 一些代码
} catch (Exception e) {
   // 处理异常
} finally {
   // 无论是否发生异常,都会执行
   // 关闭文件或释放资源等操作
}

在使用"finally"时需要注意以下几点:

  1. "finally"所包含的代码块一定会被执行,除非程序在"finally"块之前被强制退出或死机。
  2. 如果在try或catch块中使用了return语句,那么"finally"块仍然会被执行,在"finally"块执行完后才会真正返回。
  3. "finally"块也可以与try或catch块独立使用。

8.自定义异常

自定义异常的必要?

Java无法为这个世界上全部的问题提供异常类。 如果企业想通过异常的方式来管理自己的某个业务问题,就需要自定义异常类了。

自定义异常的好处:

  • 可以使用异常的机制管理业务问题,如提醒程序员注意。
  • 同时一旦出现bug,可以用异常的形式清晰的指出出错的地方。

自定义异常可以分为两类:

1、自定义编译时异常        

  • 定义一个异常类继承Exception.  
  • 重写构造器。  
  • 在出现异常的地方用throw new 自定义对象抛出
  • 作用:编译时异常是编译阶段就报错,提醒更加强烈,一定需要处理!!

2、自定义运行时异常

  • 定义一个异常类继承RuntimeException.
  • 重写构造器。
  • 在出现异常的地方用throw new 自定义对象抛出!
  • 作用:提醒不强烈,编译阶段不报错!!运行时才可能出现!!

下面是一个简单的自定义异常的 Java 例子:

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

这个例子定义了一个名为 MyException 的自定义异常,它继承了 Java 内置的 Exception 类。在这个自定义异常类中,我们只是重写了父类的构造函数,为其添加了一个带有字符串参数的构造函数。

这个自定义异常类可以用于抛出我们自己定义的异常信息,例如:

public void myMethod(int x) throws MyException {
    if (x < 0) {
        throw new MyException("Number cannot be negative");
    }
    // do something with x
}

在这个例子中,myMethod 方法会抛出 MyException 异常,当参数 x 是负数的时候。在异常对象创建时,我们使用带有一个字符串参数的构造函数来传递异常信息,这个信息将在异常被捕获时显示出来。

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

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

相关文章

VUE A页面跳转到B页面带参数,且每次点击跳转,数据刷新

这里写目录标题 一、描述二、VUE带参数页面跳转跳转方式&#xff1a;1&#xff09;标签<router-link>2&#xff09;js操作跳转 三、B页面实现每次点击参数变化&#xff0c;数据刷新解决方案&#xff1a;1&#xff09;去除缓存。2&#xff09;watch监听router 背景&#x…

香港:禁止中国内地参与虚拟资产交易!散户不可交易稳定币,放开不意味着放松!

前天&#xff0c;香港证监会&#xff08;SFC&#xff09;公布了对虚拟资产交易的开放态度和监管思路&#xff0c;宣布《适用于虚拟资产交易平台营运者的指引》&#xff08;下简称《指引》&#xff09;将于2023年6月1日生效。 虽然SFC对于公众提出的建议给予了很完整的回应&…

领导下发紧急且风险大的任务,如何处理?

在遇到这种无法拒绝&#xff0c;明显很难按时交付的紧急任务时&#xff0c;项目经理处理的关键&#xff1a; 1、降低关键干系人期望值 降低关键干系人的期望值&#xff0c;是项目管理非常重要的一门艺术&#xff0c;也是让干系人满意&#xff0c;便于与关系人沟通的关键。 在项…

多地住建局推广工程资料电子化,帮助工程企业“降本增效”

工程资料签署和管理是每个在建工程绕不开的课题&#xff0c;庞大的签署量、动则几十万的签署成本如何优化&#xff1b;有关部门的合规审查如何过关…纸质工程资料需要面对的难题还有很多&#xff1a; 麻烦&#xff1a;从工程立项申报、审批、设计、施工到验收等全过程中产生的大…

7-事务

目录 1.什么是事务&#xff1f; 2.为什么用事务&#xff1f; 3.事务怎么用&#xff1f; 4.事务的四大特性&#xff08;ACID&#xff09; ①原子性&#xff08;Atomicity&#xff0c;又称不可分割性&#xff09; ②一致性&#xff08;Consistency&#xff09; ③隔离性&a…

文本转语音怎么转?教你三招轻松搞定

近年来&#xff0c;人工智能技术飞速发展&#xff0c;语音合成技术 (TTS) 已经被广泛应用于各种应用场景中。在日常生活中&#xff0c;人们经常需要阅读长篇文章、新闻报道、科技论文等&#xff0c;但传统的阅读方式不仅效率低下&#xff0c;而且容易让人感到疲劳。随着语音合成…

品牌需要来看看这个UP主眼里的“她困境”

连续三次发布带货视频&#xff0c;但却仍然涨粉3w。 5月16日&#xff0c;时尚区UP主鹦鹉梨在B站发布作品《漫画胸能不能走出现实啊&#xff1f;&#xff1f;&#xff1f;&#xff1f;》&#xff0c;视频中UP主指出现在女性在生活中的一大困境&#xff0c;当下互联网上的审美一…

【突发奇想 之 vector使用时性能测试】

目录&#xff1a; 前言分析vector不同操作对时间的影响1.for循环中使用 size()成员函数2.初始化时初始化为0&#xff0c;与其他值3.vector分配容量问题4. vector赋值操作5. 遍历&#xff1a;下标和迭代器 总结 前言 打怪升级&#xff1a;第90天 分析vector不同操作对时间的影响…

2023百城巡展|首站北京迎来新老朋友,百家聚势共拓数安蓝海

“新起点 新战略 共赢数安蓝海” 2023年4月 在首届渠道高峰论坛上 美创通过一系列革新之举 传递了坚定渠道化战略的决心 2023年5月 步履不停&#xff0c;加速渠道战略下沉 与全国各地伙伴更深入沟通&#xff0c;互信赋能 美创2023百城巡展正式启航 5月23日&#xff0c;美…

python绘制带置信区间的折线图

本文目录 一、数据准备二、添加置信区间三、完整代码四、运行结果五、python绘图往期系列文章目录 在统计学和数据分析领域中&#xff0c;我们常常需要比较两个或多个样本数据之间的差异。而带置信区间的折线图则是一种直观且常用的展示数据差异的方式。在这篇文章中&#xff0…

xml报文转Java实体

公众号推广: 目前CSDN进行VIP可见,文章可在微信公众号进行免费的阅读。 文章内容经过认证实践,比较的清晰易懂,适合初次接触的人员。 请关注微信公众号:菜鸟编程踩坑之路,进入公众号搜索关键词 xml转实体 需求场景: 因为需要对接一些比较老的系统接口,他们的请求方…

AI生成和修改音频音乐类工具网站集合

AI时代&#xff0c;有最强问答ChatGPT,有文本生成图像的Stable Diffusion,Midjourney&#xff0c;当然也少不了AI生成和修改音频的各种工具&#xff0c;我们整理出其中最具影响力的&#xff0c;并且可能最用得上的一些收录到 AI生成和修改音频类工具网站集合​http://www.webhu…

Vue3:组件基础(下)

Vue3&#xff1a;组件基础&#xff08;下&#xff09; Date: April 12, 2023 Sum: props验证、计算属性、自定义时间、组件上的v-model、任务列表案例 目标&#xff1a; 能够知道如何对 props 进行验证 能够知道如何使用计算属性 令能够知道如何为组件自定义事件 令能够知…

照相机标定

一.相机标定的原理 1.1 相机如何成像&#xff1a; 相机成像系统中&#xff0c;共包含四个坐标系&#xff1a;世界坐标系、相机坐标系、图像坐标系、像素坐标系。 1.1.1 世界坐标系&#xff1a; 世界坐标系&#xff08;world coordinate&#xff09;&#xff0c;也称为测量坐…

面试技巧:原来薪资可以这样谈~

从房地产到程序员是蓄谋已久&#xff0c;也是时机成熟 2020年毕业之后&#xff0c;我便开始从事房地产销售工作&#xff0c;卖了两年房子才来黑马学习。 其实毕业那年就想来黑马学习的&#xff0c;虽然大学专业学的工商管理&#xff0c;但是我对计算机专业更感兴趣。毕业时&a…

2个半月学习成功上岗软件测试,我一个文科女也能吃IT饭了

想不到我一个文科生也能吃上IT饭&#xff0c;真的是太香了&#xff01;&#xff01;&#xff01; 程序员的待遇怎么这么好&#xff01;&#xff08;请大家原谅我没有见过市面的感叹&#xff0c;对于我这种刚上岗的新手而言&#xff0c;能够在厦门这个全国工资房价比最低的地方…

手机照片如何压缩?高效软件分享

现如今&#xff0c;手机已经成为了人们生活中不可或缺的一部分。我们用手机来拍摄照片&#xff0c;记录生活中的点滴&#xff0c;与朋友分享美好时刻。但是&#xff0c;随着手机像素越来越高&#xff0c;照片的体积也越来越大&#xff0c;使得手机储存空间不够用&#xff0c;而…

ApiKit 干货纯享|20分钟搞定接口管理、开发、测试全流程!

一. ApiKit 简介 ApiKit 是 API 管理 Mock 自动化测试 异常监控 团队协作 ApiKit 主要用于接口管理、开发、测试全流程集成工具&#xff0c;使用受众为整个研发技术团队&#xff0c;主要使用者为前端开发、后端开发和测试人员。从个人开发者到跨国企业用户&#xff0c;Api…

aop实现自定义注解

注解简单知识 关键字 自定义注解的关键字是interface 参数类型 自定义注解的参数类型&#xff1a;八大基础类型、String、枚举、注解&#xff0c;还可以是以上类型对应的数组 如果只有一个成员变量&#xff0c;名字叫value 注解赋值 如果定义了成员变量&#xff0c;必须…

ROS/ROS2工程中的路径管理

1 Launch文件访问yaml ROS2中&#xff0c;launch文件可以用python编写&#xff0c;且后缀名为.launch.py&#xff0c;由于python比传统的xml更加灵活&#xff0c;因此&#xff0c;可以在launch文件中找到某个package的yaml。yaml通常存在package下面的config目录下&#xff0c…