【Java学习笔记】异常
异常(Exception)
一、基本介绍
在 Java 程序中,将运行中发生的不正常情况称为 “异常”,开发过程中的语法错误和运行时发生的异常情况是不一样的。
二、异常的分类
-
1. Error(错误):Java 虚拟机无法解决的严重问题,比如:JVM 虚拟机的崩溃、虚拟机内存溢出等 “严重” 问题。比如:StackOverflowError(栈溢出)和 OutOfMemoryError(内存溢出)等。Error 是系统级的错误,程序无法处理
-
2. Exception(异常):其他因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。例如:空指针异常、数组越界异常、文件找不到异常等
-
(1)编译异常
-
编译时异常,是编译器要求必须处理的异常。
-
-
(2)运行异常
-
运行时异常,编译器检查不出来。一般是指编程时的逻辑错误,是程序员应该避免其出现的异常
-
对于运行时异常,可以不作处理,因为这类异常很普遍,若全处理可能会对程序的可读性和运行效率产生影响
-
-
-
3. 自定义异常
三、处理异常的方法
-
(1)
try-catch-finally
-
(2)
throws
四、异常体系图(重点!!)
异常体系图体现了继承关系
说明
-
在
Trowable
下的两个子类-
Error
-
Exception
-
-
在异常
Exception
下又有两个分类-
编译异常(列举了两个)
-
FileNotFoundException
-
ClassNotFoundException
-
-
运行异常:
RuntimeException
(常见的五个)-
NullPointerException
:空指针异常 -
ArithmeticException
:数学运算异常 -
ArrayIndexOutOfBoundsException
:数组下标越界异常 -
ClassCastException
:类型转换异常 -
NumberFormatException
:数字格式不正确异常
-
-
五、throws
和 throw
的区别
一、编译异常
(1)介绍:编译异常是指在编译期间,就必须处理的异常,否则代码不能通过编译
(2)常见的编译异常
-
SQLException
:操作数据库时,查询表可能发生异常 -
IOException
:操作文件时,发生的异常 -
FileNotFoundException
:操作一个不存在的文件时,发生异常 -
ClassNotFoundException
:加载类,而该类不存在时,异常 -
EOFException
:操作文件,到文件末尾,发生异常 -
IllegalArgumentException
:参数异常
二、运行异常
(1)介绍:在编译时不会发现,在程序运行时出现的逻辑错误导致的异常,若不做处理,默认抛出(throws)异常,交给 父类 或 上一级 来处理
(2)常见类型
-
NullPointerException
:空指针异常 -
ArithmeticException
:数学运算异常 -
ArrayIndexOutOfBoundsException
:数组下标越界异常 -
ClassCastException
:类型转换异常 -
NumberFormatException
:数字格式不正确异常
异常演示
(1)NullPointerException
:空指针异常
public class NullPointerException_ {public static void main(String[] args) {String name = null;System.out.println(name.length());}
}
异常:获取空字符窜的长度
(2)ArithmeticException
:数学运算异常
public class ArithmeticException_ {public static void main(String[] args) {int a = 1;int b = 0;System.out.println("a / b = " + a / b);}
}
异常:分母为 0
(3)ArrayIndexOutOfBoundsException
:数组下标越界异常
public class ArrayIndexOutOfBoundsException_ {public static void main(String[] args) {int[] arr = {1, 2, 3};for (int i = 0; i <= arr.length; i++) {System.out.println("arr[" + i + "] = " + arr[i]);}}
}
异常:数组只有三个元素,却访问了第四个元素
(4)ClassCastException
:类型转换异常
public class ClassCastException_ {public static void main(String[] args) {person p_a = new A(); // 向上转型A a = (A)p_a; // 向下转型// 两个不相关的类进行转换会报异常B b = (B) p_a; // A 和 B 之间无关系,不可以把指向 A 的转换为 B}
}class person {}class A extends person{}class B extends person{}
异常:A 类 和 B 类 没有关系,不可以把指向 A 类 的对象转成指向 B 类 的对象
(5)NumberFormatException
:数字格式不正确异常
public class NumberFormatException_ {public static void main(String[] args) {String name = "异常";// 将 String 转成 intint num = Integer.parseInt(name);System.out.println(num);}
}
异常:无法将字符串转化为整数
三、异常处理
1. try - catch - finally
使用方法:选中可能出现异常的代码部分,使用快捷键ctrl + alt + t
,在弹窗中选择需要的结构即可
1. 三种结构
-
try - catch
-
try - finally
-
try - catch - finally
2. 基本结构图
3. 代码示例
public class main {public static void main(String[] args) {try {String name = "异常";// 将 String 转成 intint num = Integer.parseInt(name); // 会抛出 NumberFormatExceptionSystem.out.println(num);} catch (NumberFormatException e) {System.out.println(e.getMessage());} finally {System.out.println("程序执行到 finally 部分.....");}}
}
说明:在catch结构中,使用getMessage()方法获取异常信息
4. try - catch结构的使用细节
-
(1)如果异常发生了,则异常后面的代码不会执行,直接进入到
catch
块 -
(2)如果异常没有发生,则顺序执行 try 的代码块,不会进入到
catch
-
(3)不管异常是否发生,都希望指向某段代码(比如:关闭连接,释放资源等),可以使用
finally
结构-
注意:
finally
中的代码必须执行!!
-
-
(4)可以有多个 catch 语句,捕获不同的异常(进行不同的业务处理)
-
(1)子类在前,父类在后
-
(2)只会匹配一个
catch
-
5. try - finally结构的使用细节
该用法相当于没有捕获异常,因此程序会直接退出==崩掉 / 退出
应用场景:执行一段代码后,不管是否发生异常,都必须执行某个业务逻辑(finally
部分的代码)
解释:为什么子类在前,父类在后?
package exception_;public class main {public static void main(String[] args) {try {// NullPointerExceptionString name = null;System.out.println(name.length());// ArrayIndexOutOfBoundsExceptionint[] arr = {1,2,3};for (int i = 0; i <= arr.length; i++) {System.out.println("arr[" + i + "] = " + arr[i]);}} catch (NullPointerException e) {System.out.println("空指针异常:" + e.getMessage());} catch (ArrayIndexOutOfBoundsException e){System.out.println("数组下标越界异常:" + e.getMessage());}System.out.println("程序继续执行......");}
}// 运行结果
空指针异常:null
程序继续执行......
代码解析
NullPointerException
(子类)和ArrayIndexOutOfBoundsException
(子类)都是RuntimeException
(父类)的子类,然而运行异常又是Exception
的子类,如果把父类Exception
写在前面,即包含了所有子类,后面再写子类就没有意义了
6. try - catch的练习题
public class ExceptionExe01 {public static int method() {int i = 1;try {i++;String[] names = new String[3];if (names[1].equals("tom")) {System.out.println(names[1]);} else {names[3] = "jack";}return 1;} catch (ArrayIndexOutOfBoundsException e) {return 2;} catch (NullPointerException e) {return ++i;} finally {++i;System.out.println("i = " + i);}}public static void main(String[] args) {System.out.println(method());}
}
程序执行结果
i = 4
3
解释
-
(1)finally 一定会执行,所以在调用方法的时候就执行了其中的代码,调用了 method()方法,输出的肯定是方法的返回值
-
(2)代码中属于空指针异常,即会在
catch (NullPointerException e)
中返回 i 的值
2. throws
1. 基本介绍:抛出异常
-
(1)程序可能出现某些异常,通过throws显示的声明,不做处理
-
(2)在方法声明中用throws语句可以声明抛出异常的列表,抛出的异常类型可以是
-
1. 方法中产生的异常类型
-
2. 抛出的异常类型的父类
-
-
(3)抛出的异常由上一级 / 调用者 / 父类进行处理
-
注意点:如果抛出的是编译异常,上一级必须显示声明异常的处理
-
(1)上一级做try - catch的处理,捕获异常
-
(2)继续抛出异常throws
-
-
-
(4)如果上一级都不做处理,最后到 JVM 时,会直接结束程序,输出异常信息
2. 基本原理图
3. 代码示例
(1)抛出方法中的异常
public static void method() throws NullPointerException,ArrayIndexOutOfBoundsException{// NullPointerExceptionString name = null;System.out.println(name.length());// ArrayIndexOutOfBoundsExceptionint[] arr = {1,2,3};for (int i = 0; i <= arr.length; i++) {System.out.println("arr[" + i + "] = " + arr[i]);}System.out.println("程序继续执行......");
}
(2)抛出方法中的异常的父类
public static void method() throws RuntimeException{// NullPointerExceptionString name = null;System.out.println(name.length());// ArrayIndexOutOfBoundsExceptionint[] arr = {1,2,3};for (int i = 0; i <= arr.length; i++) {System.out.println("arr[" + i + "] = " + arr[i]);}System.out.println("程序继续执行......");
}
代码解释
父类:
RuntimeException
子类
NullPointerException
ArrayIndexOutOfBoundsException
4. throws 的使用细节
-
(1) 对于编译异常,程序中必须处理(try-catch 或者 throws)
-
(2) 对于运行时异常,程序中如果没有处理,默认就是throws的方式处理
-
(3) 子类重写父类的方法时,子类重写的方法所抛出异常类型的两种情况
-
1. 要么类型要和父类抛出的异常一致
-
2. 要么为父类抛出的异常的类型的子类型
-
-
(4) 在 throws 过程中,如果有方法 try-catch,就相当于处理异常,就可以不必 throws
代码解析:子类重写父类方法抛出异常
class a {public void method() throws RuntimeException{// NullPointerExceptionString name = null;System.out.println(name.length());}
}class b extends a {@Overridepublic void method() throws ArrayIndexOutOfBoundsException{// ArrayIndexOutOfBoundsExceptionint[] arr = {1, 2, 3};for (int i = 0; i <= arr.length; i++) {System.out.println("arr[" + i + "] = " + arr[i]);}}
}
代码解析
b 类是 a 类的子类,则b 类抛出的异常必须是 a 类抛出异常类型的子类,然而 a 类抛出异常的类型NullPointerException
是RuntimeException
的子类,抛出的异常类型用其父类代替是没有问题的
但是!!!
若将子类抛出异常的类型换成Exception
,必然会报错,因为扩大了父类抛出异常的类型(本质还是继承关系)
3. 自定义异常
1. 基本介绍
程序出现了某些"错误",但该错误信息并没有在Throwable
子类中描述处理,这个时候可以自己设计异常类,自定义异常的描述信息
2. 构建方法
-
(1)定义类:自定义异常类名(程序员自己写),继承
Exception
或RuntimeException
-
(2)如果继承
Exception
,属于编译时异常(受检异常) -
(3)如果继承
RuntimeException
,属于运行时异常(非受检异常)
3. 应用案例
要求:接收 person 对象年龄时,要求年龄范围在 18 - 120
之间,否则抛出一个自定义异常,并给出提示信息
代码示例
package exception_;public class main {public static void main(String[] args) {int age = 180;if(!(age >= 18 && age <= 120)){throw new AgeException("年龄需要在 18 - 120 之间");}System.out.println("你的年龄范围正确");}
}class AgeException extends RuntimeException {// 调用 RuntimeException 的构造器,修改异常信息public AgeException(String message) {super(message);}
}
输出结果
Exception in thread "main" exception_.AgeException: 年龄需要在 18 - 120 之间at exception_.main.main(main.java:7)
代码解析
思路:创建了一个类,通过调用父类的构造器,在创建自定义异常调用构造器来传入自定义异常信息
如何理解 new?
异常是一个类,抛出的必须是异常类的一个对象实例,所以需要 new,创建对象时通过调用构造器传入信息来完成对象实例的初始化
4. throws
和 throw
的区别
意义 | 位置 | 后面跟的东西 |
---|---|---|
throws | 方法声明处 | 异常类型 |
throw | 方法体中 | 异常对象 |
相关文章:

【Java学习笔记】异常
异常(Exception) 一、基本介绍 在 Java 程序中,将运行中发生的不正常情况称为 “异常”,开发过程中的语法错误和运行时发生的异常情况是不一样的。 二、异常的分类 1. Error(错误):Java 虚拟…...

MySQL:视图+用户管理+访问+连接池原理
一、视图 视图是一个虚拟表,其内容由查询定义。同真实的表一样(相当于是把查询的内容当成一个临时表来使用),视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表,基表的数据变化也会影响到视图。 1.1 为…...

neo4j 5.19.0安装、apoc csv导入导出 及相关问题处理
前言 突然有需求需要用apoc 导入 低版本的图谱数据,网上资料又比较少,所以就看官网资料并处理了apoc 导入的一些问题。 相关地址 apoc 官方安装网址 apoc 官方导出csv 教程地址 apoc 官方 导入 csv 地址 docker 安装 执行如下命令启动镜像 doc…...
C/C++ OpenCV 矩阵运算
C/C OpenCV 矩阵运算详解 💡 OpenCV 是一个强大的开源计算机视觉和机器学习库,它提供了丰富的矩阵运算功能,这对于图像处理和计算机视觉算法至关重要。本文将详细介绍如何使用 C/C 和 OpenCV 进行常见的矩阵运算。 矩阵的创建与初始化 在进…...

无人机桥梁3D建模的拍摄频率
无人机桥梁3D建模的拍摄频率 无人机桥梁3D建模的拍摄频率(每秒拍摄照片数)需根据建模精度、飞行速度、相机性能等因素综合确定。以下是专业级作业的详细参数分析: 1. 核心计算公式 拍摄频率(fps) \frac{飞行速度&…...

ESP32-idf学习(三)esp32C3连接iot
一、前言 上一篇用蓝牙作为通信方式,虽然勉强完成了控制,但结果显然不是那么符合我们的预期,既然用蓝牙还需要研究一段时间,那我们就先整一些现成的,不需要研究的!iot云平台!这里当然也是通过w…...

详解鸿蒙仓颉开发语言中的计时器
今天又到了大家喜闻乐见的科普环节,也可以说是踩坑环节,哈哈哈。今天聊一聊仓颉开发语言中的计时器,这部分可老有意思了。 为什么这么说呢,因为关于仓颉的计时器你几乎搜不到任何的文档,也没有相关的代码提示…...

【计算机网络】第3章:传输层—拥塞控制原理
目录 一、PPT 二、总结 (一)拥塞的定义 (二)拥塞产生的原因 (三)拥塞控制的目标 (四)拥塞控制方法分类 1. 端到端拥塞控制 2. 网络辅助拥塞控制 (五)…...

Vue3(watch,watchEffect,标签中ref的使用,TS,props,生命周期)
Vue3(watch,watchEffect,标签中ref的使用,TS,props,生命周期) watch监视 情况三:监视reactive定义的对象类型的数据 监视reactive定义的对象类型的数据,默认开启深度监视。地址没变,新值和旧…...

【nssctf第三题】[NSSCTF 2022 Spring Recruit]easy C
这是题目,下载附件打开是个C文件 #include <stdio.h> #include <string.h>int main(){char a[]"wwwwwww";char b[]"dvxbQd";//try to find out the flagprintf("please input flag:");scanf(" %s",&a);if…...
Cocos 打包 APK 兼容环境表(Android API Level 10~15)
使用 Cocos 打包 APK:Android 10 ~ Android 15 兼容版本对照表 ✅ 本表基于 Cocos Creator 3.x 实际测试及官方建议整理 📆 最后更新时间:2025年6月 💡 推荐使用 Android Studio 2022 或命令行构建工具 Android 版本API Level推荐…...
数据结构之堆:解析与应用
一、堆的核心定义与性质 堆是一种特殊的完全二叉树,分为最大堆和最小堆: 最大堆:每个节点的值 ≥ 子节点值,根节点为最大值。最小堆:每个节点的值 ≤ 子节点值,根节点为最小值。 关键性质: …...

DBeaver导入/导出数据库时报错解决方案
导出: 报错:mysqldump: Got error: 2026: SSL connection error: error:0A000102:SSL routines::unsupported protocol when trying to connect 在额外的命令参数中添加"--ssl-modeDISABLED"可以关闭SSL服务,从而成功解决问题。这…...
GPIO模拟串口通信
在资源受限的嵌入式项目中,GPIO模拟串口(UART)仍有实际需求。尽管现代MCU多数具备多个硬件串口,但实际项目中仍可能遇到串口数量不足的情况,尤其在低成本、小封装芯片的应用场景中。 一、GPIO模拟串口的基本原理 GPIO模拟串口,顾名思义,就是通过软件控制普通IO口的高低…...

uniapp与微信小程序开发平台联调无法打开IDE
经测试属于网络问题。本机需要联网。否则会出现Hbuilder运行微信小程序到模拟器时无法打开 微信开发者工具 这个页面出不来会一直显示异常。这期间微信小程序开发工具的端口是通的 需要先联网...

第十二节:第五部分:集合框架:Set集合的特点、底层原理、哈希表、去重复原理
Set系列集合特点 哈希值 HashSet集合的底层原理 HashSet集合去重复 代码 代码一:整体了解一下Set系列集合的特点 package com.itheima.day20_Collection_set;import java.util.HashSet; import java.util.LinkedHashSet; import java.util.Set; import java.util.…...

【C++项目】:仿 muduo 库 One-Thread-One-Loop 式并发服务器
🌈 个人主页:Zfox_ 🔥 系列专栏:C从入门到精通 目录 🔥 前言 一:🔥 项目储备知识 🦋 HTTP 服务器🦋 Reactor 模型🎀 单 Reactor 单线程:单I/O多路…...

基于大数据的个性化购房推荐系统设计与实现(源码+定制+开发)面向房产电商的智能购房推荐与数据可视化系统 基于Spark与Hive的房源数据挖掘与推荐系统设计
博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…...

FFmpeg学习笔记
1. 播放器的架构 2. 播放器的渲染流程 3. ffmpeg下载与安装 3.0 查看PC是否已经安装了ffmpeg ffmpeg 3.1 下载 wget https://ffmpeg.org/releases/ffmpeg-7.0.tar.gz 3.2 解压 tar zxvf ffmpeg-7.0.tar.gz && cd ./ffmpeg-7.0 3.3 查看配置文件 ./configure …...

Chrome 通过FTP,HTTP 调用 Everything 浏览和搜索本地文件系统
【提问1】 Chrome调用本地 everything.exe, everything 好像有本地 FTP 服务器? 【DeepSeek R1 回答】 是的,Everything 确实内置了 HTTP/FTP 服务器功能,这提供了一种相对安全的浏览器与本地应用交互的方式。以下是完整的实现方案&#x…...

GpuGeek如何成为AI基础设施市场的中坚力量
AI时代,算力基础设施已成为支撑技术创新和产业升级的关键要素。作为国内专注服务算法工程师群体的智算平台,GpuGeek通过持续创新的服务模式、精准的市场定位和系统化的生态建设,正快速成长为AI基础设施领域的中坚力量。本文将深入分析GpuGeek…...

【Hot 100】45. 跳跃游戏 II
目录 引言跳跃游戏 IIdp解题贪心解题 🙋♂️ 作者:海码007📜 专栏:算法专栏💥 标题:【Hot 100】45. 跳跃游戏 II❣️ 寄语:书到用时方恨少,事非经过不知难! 引言 跳跃…...
Codeforces Round 1026 (Div. 2) C. Racing
Codeforces Round 1026 (Div. 2) C. Racing 题目 In 2077, a sport called hobby-droning is gaining popularity among robots. You already have a drone, and you want to win. For this, your drone needs to fly through a course with n n n obstacles. The i i i-…...
Python库CloudScraper详细使用(绕过 Cloudflare 的反机器人页面的 Python 模块)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、CloudScraper概述1.1 CloudScraper 介绍1.2 安装二、基本使用方法2.1 创建scraper实例2.2 发送请求2.3 带参数的请求2.4 自定义浏览器指纹2.5 设置代理2.6 自定义请求头三、高级配置3.1 处理Cloudflare挑战-自动处理…...
oracle sql 语句 优化方法
1、表尽量使用别名,字段尽量使用别名.字段名,这样子,可以减少oracle数据库解析字段名。而且把 不需要的字段名剔除掉,只保留有用的字段名,不要一直使用 select *。 2、关联查询时,选择好主表 。oracle解析…...

Python数学可视化——显函数、隐函数及复杂曲线的交互式绘图技术
Python数学可视化——显函数、隐函数及复杂曲线的交互式绘图技术 一、引言 在科学计算和数据分析中,函数与方程的可视化是理解数学关系和物理现象的重要工具。本文基于Python的Tkinter和Matplotlib库,实现一个功能完善的函数与方程可视化工具ÿ…...

代码随想录打卡|Day51 图论(dijkstra(堆优化版)精讲、Bellman_ford 算法精讲)
图论part09 dijkstra(堆优化版)精讲(不熟悉) 代码随想录链接 题目链接 import java.util.*;class Edge {int to; // 邻接顶点int val; // 边的权重Edge(int to, int val) {this.to to;this.val val;} }class MyComparison implements Comparator<…...
【深度剖析】流处理系统性能优化:解决维表JOIN、数据倾斜与数据膨胀问题
目录 前言:为什么你的流处理作业总是慢? 一、维表JOIN优化:从普通连接到高性能查询 1.1 时态表的双面性 1.2 Lookup Join 优化 1.3 多表JOIN优化策略 二、数据倾斜:单分区也会遇到的隐形杀手 2.1 单分区数据倾斜 2.2 热点键打散技术 2.3 时间窗口预聚合 三、数据…...
PostgreSQL优化实践:从查询到架构的性能提升指南
## 引言 PostgreSQL作为先进的开源关系型数据库,在复杂查询处理与高并发场景中表现卓越,但不当的使用仍会导致性能瓶颈。本文系统性梳理优化路径,覆盖SQL编写、索引策略、参数调优等关键环节,配合代码示例与量化建议,…...

AI入门——AI大模型、深度学习、机器学习总结
以下是对AI深度学习、机器学习相关核心技术的总结与拓展,结合技术演进逻辑与前沿趋势,以全新视角呈现关键知识点 一、深度学习:从感知到认知的技术革命 核心突破:自动化特征工程的范式变革 深度学习通过多层神经网络架构&#x…...