Java异常体系

ops/2024/10/19 9:24:28/

1. 概述

在这里插入图片描述
以下是详细内容

2. 什么是异常

编程的错误分为语法错误、逻辑错误、异常三种,其中语法错误和逻辑错误不属于异常。因为如果发生语法错误,Java程序根本无法运行,而如果发生逻辑错误,Java程序也不可能得到正确的结果。

我们说的异常是指程序既没有语法错误,也没有逻辑错误,而是在运行过程中遇到一些程序意外的错误,导致Java程序发生异常,从而导致Java程序崩溃。

我们在编程过程中,就是要尽量考虑到这些异常情况,并编写合理的异常处理代码,这样即使程序发生异常,也不会导致程序崩溃。

3. 异常的分类

对于一些程序意外的错误,一般有两种解决方法

  • 一种是遇到错误就终止程序的运行
  • 另一种是程序员在编写程序时,就先考虑错误的检测、错误消息的提示,以及错误的处理

Java将程序执行时可能发生的错误(Error)或异常(Exception),都封装成了类,作为java.lang.Throwable的子类,即Throwable是所有错误(Error)或异常(Exception)的超类。

为什么Throwable的子类又分为错误和异常呢 ?

  • 错误 (Error) : 指的是Java虚拟机无法解决的严重问题,一般不编写针对性的代码进行处理。
  • 异常 (Exception) : 指其他因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。
    • 异常>受检异常,又称之为运行时异常(RuntimeException) : 这类异常发生的概率太高,一个合格的程序员都会时刻警惕它们,从而通过相应的判断或特殊处理来避开它们。
      • 所以,针对运行时异常Java编译器将不会要求加上try-catch异常处理。
    • 异常>受检异常 : 这些异常就算程序员经验再丰富,也很难控制,比如网络连接中断,用户指定读取的文件丢失,写文件时发现磁盘空间不足等。
      • 针对这些异常Java编译器会帮助程序员进行校验和提醒
        • 一旦编写了相关的代码,编译器就会提醒你,要使用try-catch等方式,来处理异常
        • 如果你此时不听建议,仍然不处理,那么编译就不会通过。

注 : 除了ErrorRuntimeException及其子类属于非异常>受检异常类型,剩下的都是异常>受检异常类型,包括ThrowableException两个类型本身。具体如下图所示 :
在这里插入图片描述

4. 异常处理

Java处理异常有以下三种方式

  • 在当前方法发生异常的代码处直接捕获并处理
  • 在当前方法中不处理,直接抛给调用方处理
  • 当我们找不到一个能准确表达我们意图的异常类型时,可以自定义异常
4.1 try-catch-finally

Java中的异常对象,可以通过try-catch结构进行捕获处理

java">try {//do something
} catch (Exception e) {e.printStackTrace();
} finally {//无论是否发生异常,都一定会执行finally//比如IO流的关闭、网络连接的断开等代码,这就需要使用finally块
}

当程序中的某段代码可能发生异常时,可以用try结构进行包围。
如果try结构中的代码没有发生异常,那么程序将正常运行万try结构中的代码,不会理会任何catch分支。
但是,如果try结构中的代码发生了异常,则首先会中断try结构中剩下代码的执行,并抛出对应的异常对象,交由catch分支去由上到下匹配执行。此时如果所有catch分支都不匹配,那么相当于该异常没有被捕获到,自动抛给调用方来处理。
而finally 分支,无论是否发生异常,都一定会执行。比如IO流的关闭、网络连接的断开等代码,这就需要使用finally块。

4.2 关键词 throws

如果某段代码可能发生异常,并且也非常清楚如何处理该异常,那么使用try-catch结构是最直接的。
但是有时候,在当前方法中,无法确定如何处理该异常,那么可以将throws(异常信息)抛给上一级处理。
(就如同现实生活中,自己处理不了的问题,上升到上级领导处理)

4.3 自定义异常类型

Java规定异常或错误的类型必须继承自现有的Throwable或其子类。
通常我们会继承Exception(异常>受检异常)或RuntimeException(非异常>受检异常)

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

注意 : 自定义异常对象只能通过throw语句手动抛出,之后才能通过try-catch处理或throws抛给调用方。

java">throw new MyException("具体报错提示XXXXXYYYY")

5. 异常信息的查看

当程序发生异常时,Java会抛出一个对应类型的对象,那么当控制台打印了一个异常对象的相关信息后,该如何查看呢 ?

  • Throwable getCause():获取引起异常的原因。
  • String getMessage():获取异常的详细信息。
  • void printStackTrace():用标准错误的样式打印异常类型、描述信息及堆栈跟踪信息。

6. 参考

《剑指Java》


http://www.ppmy.cn/ops/126678.html

相关文章

repo 命令大全详解(第十一篇 repo init)

repo forall 命令用于在指定的项目上执行给定的命令&#xff0c;非常适合批量操作。 参数分类及解释 基本参数 [<project>...]: 可选&#xff0c;指定要操作的项目。如果不指定&#xff0c;则对所有项目执行命令。 示例: repo forall my_project -c "git status&q…

目标检测最新SOTA模型D-FINE

2024年10月18号&#xff0c;中科大推出了 D-FINE&#xff0c;这是一款功能强大的实时物体检测器&#xff0c;通过重新定义 DETR 模型中的边界框回归任务实现了出色的定位精度。 摘要 D-FINE 包含两个关键组件&#xff1a;细粒度分布细化 (FDR) 和全局最优定位自蒸馏 (GO-LSD)…

eggjs sequelize egg-sequelize-auto自动从零生成一个数据表 自动创建model

sequelize egg-sequelize-auto整个过程还是有一些坑 包括兼容性问题 依赖安装问题 需要注意 缺少一个条件 包跑不起来 或使用体验很差 1. 全局安装插件 pnpm install -g sequelize-cli sequelize mysql2 egg-sequelize-auto 2. 执行命令创建 migrate迁移文件 以及 mod…

HDU RSA

翻译成中文后&#xff1a; 思路&#xff1a;由题易得&#xff0c;d * e y * f ( n ) 1 ,且gcd ( e , f ( n ) ) 1,所以用扩展欧几里得求出 d &#xff0c;但要保证 d 是非负的&#xff0c;最有用快速幂求出每个字符即可。 #include<bits/stdc.h> using namespace std;…

【计算机网络 - 基础问题】每日 3 题(四十二)

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?typeblog &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞…

Java生死簿管理小系统(简单实现)

学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把手教你开发炫酷的vbs脚本制作(完善中……&#xff09; 4、牛逼哄哄的 IDEA编程利器技巧(编写中……&#xff09; 5、面经吐血整理的 面试技…

几种HTTP请求参数的简单介绍

目录 一、概述 二、查询参数 三、JSON格式参数 四、x-www-form-urlencoded 五、multipart/form-data 一、概述 在 Web 开发中&#xff0c;前端需要与后端服务器进行数据交互&#xff0c;常见的方式是通过 HTTP 请求发送数据给后端。 本文章将介绍以下几种常用的请求参数…

cocos Creator + fairyGUI 快速入门

版本 Creator 3.8.x&#xff0c;FairyGUI 2022 大部分内容来自 https://en.fairygui.com/docs/sdk/creator 1.新建cocos项目&#xff0c;根目录运行 npm install --save fairygui-cc 引入 fairyGUI库 2.assets目录之外新建fairyGUI项目 3.fairyGUI中编辑UI 完成后发布到Creato…