异常(Exception)

news2025/8/8 13:42:19

随着面向对象的结束,我们的JavaSE也就接近了尾声,还有两个章节没有去梳理,常用类和异常,本章先讲异常,剩下的常用类后面再来补。

废话不多说,直接开始本章的内容。

1. 认识异常

引出: 假设 num1(值为10)/ num2(值为0)这一行代码被执行,那么程序就会崩溃,继而抛出异常:ArithmeticException. 后面的代码不执行。

对我们而言,它只是不小心输入了一个0 作为分母,被一个不算致命的错误导致了整个程序崩溃,是不是不值得?

于是提出了异常、异常处理机制。

在Java中,将程序执行过程中发生的不正常行为称为异常,例如上述提到的

ArithmeticException(算术异常)

ArrayIndexOutOfBoundsException(数组越界异常)

NullPointerException(空指针异常)

我们来看个例子:

从上述过程中可以看到,java的异常,都有与其对应的类来进行描述。

2 异常的体系结构

这是从知乎上找到的一张图;

这是jdk1.8 手册上的;

从上图中我们可以知道:

Throwable:是异常体系的顶层类,其派生出两个重要的子类, Error 和 Exception
Error(错误):指的是Java虚拟机无法解决的严重问题,比如:JVM的内部错误、资源耗尽等,典型代表:StackOverflowError和OutOfMemoryError,一旦发生回力乏术。
Exception:其他因编译错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。例如空指针访问,试图读取不存在的文件等等。

异常的分类

异常可能在编译时发生,也可能在程序运行时发生,根据发生的时机不同,可以将异常分为:
1. 编译时异常
在程序编译期间发生的异常,称为编译时异常,也称为受检查异常(Checked Exception)
2. 运行时异常
在程序执行期间发生的异常,称为运行时异常,也称为非受检查异常(Unchecked Exception)
RunTimeException以及其子类对应的异常,都称为运行时异常。比如:NullPointerException、ArrayIndexOutOfBoundsException、ArithmeticException。

小结:

🐔异常分为两大类运行运行时异常和编译时异常。

🐔运行时异常编译器检测不出来,一般指编译器的逻辑错误,程序员应该处理。

🐔对于运行异常可以不做处理,因为很普通咯全处理可能影响程序的可读性和运行效率异常时。

🐔编译时异常则必须做处理。

常见的运行时异常:

1. NullPointerException

当然应用程序是否再需要对象的地方使用null时抛出异常。

2. ArithmeticException 

当出现异常的运算条件时,抛出此异常。

3.  ArrayIndexOutOfBoundsException

当访问数组时,访问的下表超出数组的范围,抛出此异常。

4. ClassCastException

当试图将对象强制类型转换为不是实例的子类时,抛出异常。
5. NumberFormatException

 当试图将字符串转化成一种数值类型,但该字符串不能转化为适当格式时抛出异常。

例如:

3 异常的处理

1. try - catch - finally

try - catch - finally在idea上的快捷键为:ctrl + Alt + t

程序员在代码中捕获的异常,自行处理

语法如下:

         try {

        } catch (Exception e ) {

        } finally {

解释如下:

try {
    //可能存在异常的代码
} catch (Exception e /* ”异常类型 参数变量 “,是什么类型就写什么类型,变量可以是任意名字 */) {
    //当发生异常时,将异常封装Exception 对象e,传给catch,得到异常对象后,程序员自行处理
    //如果try代码块中的代码没有异常的话,那么catch块中的代码将不执行
 } finally {
    //无论rty代码块是否发生异常,finally代码块都必须执行
}//finally块一般用于释放资源,例如IO流中文件的关闭
       
        }

 tyr - catch 注意事项

1. 可以没有finally

2. 如果异常发生了,异常代码后的代码就无法执行,直接跳到catch块

3. 不发生异常则不进入catch

4.有多个catch语句,捕获不同的异常(进行不同的业务操作),要求父类异常要在子类异常之后。

例如: Exception类在NullpointException之后

2. 异常的抛出:

在编写程序时,如果程序中出现错误,此时就需要将错误的信息告知给调用者,比如:参数检测。
在Java中,可以借助throw关键字,抛出一个指定的异常对象,将错误信息告知给调用者。具体语法如下:

throw new XXXException("异常产生的原因");

【注意事项】
1. throw必须写在方法体内部
2. 抛出的对象必须是Exception 或者 Exception 的子类对象
3. 如果抛出的是 RunTimeException 或者 RunTimeException 的子类,则可以不用处理,直接交给JVM来处理
4. 如果抛出的是编译时异常,用户必须处理,否则无法通过编译
5. 异常一旦抛出,其后的代码就不会执行

3. throws 处理机制

1. try - catch - finally  和 throws 只能二选一使用

2. 没有显示是处理异常则默认是 throws

4.  自定义异常

自定义异常的步骤:

1. 定义类:自定义异常类名(自己写)必须继承Exception 或者 RuntimeException

2. 如果继承Exception,则属于编译异常

3. 如果继承RuntimeException,则属于运行异常

例如:

public class Main {
    public static void main(String[] args) throws AgeException {
        int age = 10;
        if ( ! (age >= 18) && age <= 120) {
            throw new AgeException("年龄需要在18~100岁之间");
        }
        System.out.println("正确");
    }
}

public class AgeException extends Exception{
    public AgeException() { //无参构造器

    }

    public AgeException(String message) { //有参构造器
        super(message);
    }
}

throw 和 throws 的区别

意义位置后面接的东西
throw异常处理的一种方法方法声明处异常类型
throws手动生成异常对象的关键字方法体中异常对象

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

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

相关文章

数据结构与算法_二叉树(BST树)_面试题总结

这篇笔记记录二叉树相关的常考题。 1 BST树区间元素搜索问题 **解决方法&#xff1a;**利用BST树的中序遍历&#xff0c;中序遍历后输出的是从小到大的顺序。 // 求满足区间的元素值 [i,j];void findValues(vector<T> &vec, int i, int j){// 封装一个递归接口 fin…

精华推荐 | 【深入浅出RocketMQ原理及实战】「性能原理挖掘系列」透彻剖析贯穿RocketMQ的系统服务底层原理以及高性能存储设计挖掘深入

设计背景 消息中间件的本身定义来考虑&#xff0c;应该尽量减少对于外部第三方中间件的依赖。一般来说依赖的外部系统越多&#xff0c;也会使得本身的设计越复杂&#xff0c;采用文件系统作为消息存储的方式。 RocketMQ存储机制 消息中间件的存储一般都是利用磁盘&#xff0…

基于node.js的学生管理系统设计

目 录 摘 要 I Abstract II 第1章 绪论 1 1.1选题背景和意义 1 1.1.1选题背景 1 1.1.2选题意义 1 1.2国内外研究现状、发展动态 2 1.2.1国内研究现状 2 1.2.2国外研究现状 3 1.2.3发展动态 3 1.3研究内容 4 第2章 Node.js软件说明 5 2.1 Node.js概述 5 2.2 Node.js的模块 6 2.3…

语义信息概述

语义信息概述 什么叫语义信息 无论在图像&#xff0c;文本&#xff0c;语音处理领域等&#xff0c;我们常看到一个词&#xff0c;“语义信息”。&#xff08;有意义的数据提供的信息&#xff09; 维基百科中的解释&#xff1a; 语义信息&#xff08;英语&#xff1a;semantic…

【基础算法Ⅰ】算法入门篇

目录 进入算法世界 1.输入输出 1.1输入输出 1.2快读 2.位运算 2.1运算符 2.2位运算 3.枚举 3.1枚举的引入 3.2枚举的简单理解 3.3枚举简介 3.4 枚举算法实例 算法复杂度 时间复杂度 进入算法世界 瑞士著名的科学家Niklaus Wirth教授曾提出&#xff1a;数据结构算…

在C#方法中 out、ref、in、params 关键字的小结

out&#xff1a;关键字&#xff1a; 指定的参数在进入函数时会清空自己&#xff0c;必须在函数内部赋初值 ref关键字&#xff1a; 指定的参数必须在进入函数时赋初值&#xff0c;在函数内部可以重新赋值 In关键字&#xff1a; 指定的参数必须在进入函数时赋初值&#xff0c;…

C++入门教程||C++while循环

whlie 语法 C 中 while 循环的语法&#xff1a; while(condition) {statement(s); } 在这里&#xff0c;statement(s) 可以是一个单独的语句&#xff0c;也可以是几个语句组成的代码块。condition 可以是任意的表达式&#xff0c;当为任意非零值时都为真。当条件为真时执行…

Java.md

sa一、基础篇 网络基础 TCP三次握手 1、OSI与TCP/IP 模型2、常见网络服务分层3、TCP与UDP区别及场景4、TCP滑动窗口&#xff0c;拥塞控制5、TCP粘包原因和解决方法6、TCP、UDP报文格式 HTTP协议 1、HTTP协议1.0_1.1_2.02、HTTP与HTTPS之间的区别3、Get和Post请求区别4、HTTP常见…

Python实现BP神经网络ANN单隐层回归模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 20世纪80年代中期&#xff0c;David Runelhart。Geoffrey Hinton和Ronald W-llians、DavidParker等人分…

SpringCloud 组件Gateway服务网关【gateway快速入门】

目录 1&#xff1a;Gateway服务网关 1.1&#xff1a;为什么需要网关 1.2&#xff1a;gateway快速入门 1&#xff09;&#xff1a;创建gateway服务&#xff0c;引入依赖 2&#xff09;&#xff1a;编写启动类 3&#xff09;&#xff1a;编写基础配置和路由规则 4&#xf…

啥牌子的无线蓝牙耳机好用?无线蓝牙耳机推荐2022

蓝牙耳机这几年技术越好越高&#xff0c;其最大的魅力就是随时随地听音乐&#xff0c;无论是上下班还是日常使用&#xff0c;出门携带也方便&#xff0c;市面上的蓝牙耳机众多&#xff0c;很多人不知道该如何选择&#xff0c;下面整理了几款音质清晰&#xff0c;综合性能优秀的…

分享25个JSP源码,总有一款适合您

链接&#xff1a;https://pan.baidu.com/s/17ug7A_b2nHgu-x1K-GIVlQ?pwd6367 提取码&#xff1a;6367 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c;大家下载后可以看到。 renren-security轻量级权限管理系统 renr…

Linux C应用编程-1-文件IO

1.open与close #include <stdio.h> //IO操作需要包含的头文件 #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h>char filename[] "text.txt";int main(void) {int fd;fd open(filename, O_RD…

systemd 252 如预期的锁定了 Linux 引导过程

导读今天给大家介绍一下systemd 252锁定 Linux 引导过程systemd 252 如预期的锁定了 Linux 引导过程 之前&#xff0c;我们 报道 过&#xff0c;systemd 创始人发文指出 Linux 引导过程不安全&#xff0c;并提出采用加密签名的统一内核镜像&#xff08;UKI&#xff09;&#x…

SA实战 · 《SpringCloud Alibaba实战》第02章-专栏设计

作者:冰河 星球:http://m6z.cn/6aeFbs 博客:https://binghe001.github.io 文章汇总:https://binghe001.github.io/md/all/all.html 大家好,我是冰河~~ 从今天开始,我们正式进入《SpringCloud Alibaba实战》专栏的学习,在《开篇》一文中,我们大体介绍了整个专栏的结构安…

html一个案例学会所有常用HTML(H5)标签

目录 前言 HTML5声明 HTML框架 head头部 声明编码格式 告诉IE浏览器&#xff0c;IE8/9及以后的版本都会以最高版本IE来渲染页面。 移动端适配 网站标题 网站正文 网站内容的组成 文字有关标签 音频视频标签 表单标签与input属性 前言 HTML没有什么难度&#xf…

计算机网络笔记6应用层

前言 站在巨人的肩膀上&#xff0c;让知识的获得更加容易&#xff01;本文为学习计算机网络后,自顶向下的学习笔记&#xff1b; 学习视频来源&#xff1a; 计算机网络微课堂&#xff08;有字幕无背景音乐版&#xff09;课件pdf来源&#xff1a;评论区up bili_68567544整理目录…

Linux(基于Centos7)(三)

文章目录一、任务介绍二、任务实施2-1、管理用户账号与密码2-2、用户组管理一、任务介绍 知识目标 1.了解用户角色的类型。 2.理解用户和用户组的关系。 3.了解用户账号文件、用户密码文件和用户组账号文件。 能力目标 1.能够通过命令来创建和管理用户与用户组。 2.能够通过命…

面向对象编程·下

面向对象编程下⭐小提问解答⭐3.多态3.1向上转型 - 父类引用子类对象3.1.1方法传参3.1.2方法返回3.2动态绑定3.3方法重写3.4理解多态3.5向下转型 - 子类引用父类对象3.6super 关键字3.7在构造方法中调用重写的方法(一个坑)3.8总结4.抽象类4.1语法规则4.2抽象类的作用5.接口5.1语…

基于2D连续图像序列的行人骨架关节角度估计

目 录 第1章 绪 论 1 1.1 行人骨架关节角度估计 1 1.2 行人骨架关节角度估计的应用领域 2 1.3 行人骨架关节角度估计方法简述 3 1.3. 1 基于概率统计的方法 3 1.3.2 基于语法的方法 4 1.3.3 基于模型的方法 4 1.4 行人骨架关节角度估计的难点和面临的挑战 5 1.5 本文的研究意义…