Java异常机制
1.异常概述和异常处理机制
异常(exception)概述
异常就是程序在运行时出现的意外的,不正常的情况。

若异常产生后没有正确的处理,会导致程序的中断,程序不继续执行,以致造成损失。

2.2 异常处理机制
所以我们在开发中要一套机制来处理各种可能会发生的异常,并对其作出正确的处理,确保程序的 正常执行。这种机制称为异常处理机制,java语言是最先提供异常处理机制的。
异常处理机制可以引导程序向正确的方向运行,不至于崩溃。
3 异常处理
java异常处理包含两种代码块。 一种是try...catch,一种是try...catch...finally.
3.1 try...catch
把有可能产生异常的代码放到try中,如果产生异常由catch代码块处理。语法
| try{ // 可能产生异常的代码块 } catch(异常类型 ex){ // 异常处理 } // 后面如果还有代码,无论try中的代码有没有异常,这里都会继续执行 |
try...catch执行有三种情况 :
情况1:没有发生异常,正常执行
情况2:出现异常, catch代码块捕获异常,并进行异常处理。处理完成后程序继续执行。

需求1 : 从控制台输入两个数并做除法
| import java.util.Scanner; public class TryCatchDemo { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("请输入第一个操作数:"); try{ int num1 = sc.nextInt(); System.out.println("请输入第二个操作数:"); int num2 = sc.nextInt(); int r = num1 / num2; System.out.println("r = " + r); }catch (Exception e){ // 负责处理异常 System.out.println("出现输入不匹配异常,然后处理"); } System.out.println("程序结束"); } } |
异常发生后,从异常发生的那句代码开始,程序不继续向下运行,立即转入异常处理。
情况3:异常不匹配

| import java.util.InputMismatchException; import java.util.Scanner; public class Test01 { public static void main(String[] args) { // 需求:从控制台输入两个数并做除法 Scanner sc = new Scanner(System.in); System.out.println("请输入第一个操作数:"); try{ int num1 = sc.nextInt(); System.out.println("请输入第二个操作数:"); int num2 = sc.nextInt(); int r = num1 / num2; System.out.println("r = " + r); }catch (InputMismatchException e){ // 负责处理异常 System.out.println("出现输入不匹配异常,然后处理"); } System.out.println("程序结束"); } } |
异常不匹配,程序中断,此时我们就需要多重catch了。
3.2 多重catch
可以为try代码书写多个catch用于捕获多个具体的异常。
书写时 : 子类在上,父类在下。
| import java.util.InputMismatchException; import java.util.Scanner; public class MutiCatchDemo { public static void main(String[] args) { System.out.println("begin"); divide("17", "0"); System.out.println("ending"); } public static void divide(String a, String b) { try { int x = Integer.parseInt(a); int y = Integer.parseInt(b); System.out.println(x / y); } catch (NumberFormatException e) { //处理数字格式化异常的代码 System.out.println("字符串不包含可解析的整数"); } catch (ArithmeticException e) { //处理算术异常的代码 System.out.println("除数不能为0"); } catch (Exception e) { //处理其他未知的异常 System.out.println("未知异常"); } } } |
3.3 异常对象
异常对象是出现异常时的那条语句产生的(jvm 自动创建)。
异常在java类中通过Exception或其具体子类创建,大多数情况下都是由其子类(命名方式:异常类型 +Exception)创建, Exception是所有异常类的父类。
| 常用方法 | 方法介绍 |
| toString | 返回异常类型和异常信息 |
| getMessage | 返回异常信息 |
| printStackTrace | 打印堆栈信息(红色)。包含了异常信息,异常类型,异常位置,方便程序开发 阶段的调试(一般要打开),也是JVM默认的异常处理机制 |
java.util.InputMismatchException
at java.util.Scanner.throwFor(Scanner.java:864)
at java.util.Scanner.next(Scanner.java:1485)
at java.util.Scanner.nextInt(Scanner.java:2117)
at java.util.Scanner.nextInt(Scanner.java:2076)
at com.kal02.exception02.Test02.main(Test02.java:14)
异常堆栈信息:
第一句:表示异常类型和异常的Message构成
最后一句:包含具体发生异常的全路径类,方法,产生异常语句的行数。
com.kal02.exception02.Test02.main(Test02.java:14)
3.4 try...catch...finally
try...catch 和之前一样用于捕获并处理异常, finally代码块用于处理异常后的收尾工作。
不管是否发生异常, finally总执行。
finally的收尾工作包含释放内存、关闭文件、关闭网络连接、关闭数据库、关闭...
| step 1: 打开文件 step 2: 操作文件 step 3: 关闭文件 |
存在return的try...catch...finally
| public class TryCatchFinallyDemo { public static int div(int a,int b) { int r = 0; try { r = a / b; return r; } catch (Exception e) { System.out.println(e.toString()); } finally { System.out.println("我是finally"); } return r; } public static void main(String[] args) { System.out.println(div(10,0));; System.out.println("程序正常结束!"); } } |
总结:
. 存在return的try...catch...finally块,finally先执行,然后执行return , return 总是最后执行的。
添加try-catch快捷键
IDEA : Ctrl + Alt + T
4 异常分类
4.1 异常的继承体系
Throwable类有两个子类Error和Exception,分别表示错误和异常。
Exception 和Error的子类大都是以Error或Exception作为类名后缀。
4.1.1 Error
Error,表示代码运行时 JVM(Java 虚拟机)出现的问题。如系统崩溃或内存溢出等,不需要处理 Error,
常见的Error:
StackoverflowError:当应用程序递归太深而发生堆栈溢出时,抛出该错误。比如死循环或者没有 出口的递归调用。
outofMemoryError:因为内存溢出或没有可用的内存提供给垃圾回收器时, Java 虚拟机无法分配 一个对象,这时抛出该错误。比如new了非常庞大数量的对象而没释放。
1.4.2 Exception
Exception,表示程序在运行时出现的一些不正常情况, 一般大多数表示轻度到中度的问题,属于 可预测、可恢复问题。如除数为0,数组索引越界等,这种情况下,程序员通过合理的异常处理,确保程 序的正常运行直到结束,常见的Exception
ArrayIndexoutofBoundsException:用非法索引访问数组时抛出的异常。如果索引为负或大于等 于数组大小,则该索引为非法索引。
ArithmeticException:当出现异常的运算条件时,抛出此异常。例如, 一个整数“除以零”时,抛出 此类的一个实例。
. NullPointerException:当应用程序试图在需要对象的地方使用 null 时,抛出该异常。这种情况包 括:
异常体系分成: checked (编译)异常和runtime(运行)异常。
划分规则是, RuntimeException和其子类属于运行时异常,异常除了运行时异常,其他都是编译时异 常。
4.2 异常分类
4.2.1 运行时异常
runtime异常,顾名思义在编译时期不被检测,只有在运行时期才会被检查出来。
运行异常可以不使用try...catch处理,但一旦出现异常就将由JVM处理(打印堆栈信息)。
RuntimeException (运行时异常)通常是指因设计或实现方式不当而导致的问题。程序员小心谨慎是可 以避免的异常。如:事先判断对象是否为null就可以避免NullPointerException异常,事先检查除数不为 0就可以避免ArithmeticException异常。
运行时异常特点:
在编译阶段,Java编译器检查不出来。 一般的,程序可以不用使用try-catch和throws处理运行异常。
简而言之: 对于运行时异常程序可处理(使用try-catch或throws处理),可不处理。
4.2.2 编译时异常
编译时异常,顾名思义就是在编译时期就会被检测到的异常。除了RuntimeException以及子类以 外,其他的Exception及其子类都是编译异常,有时候也称之为检查时异常。
编译时异常特点:
在编译阶段,Java编译器会检查出异常,也就说程序中一旦出现这类异常,要么使用try-catch语句 捕获,要么使用throws语句声明抛出它,否则编译就不会通过。
简而言之: 程序要求必须处理编译异常,使用try-catch或throws处理。
常见面试题:请罗列常见的运行时异常和编译时异常(3-5个)
编译时异常(检查时异常) :程序必须做出处理, 一般继承于Exception

运行时异常:程序可处理,也可不处理。都继承于RuntimeException

意识:遇到不懂的异常类时,首先要分辨它属于检查时还是运行时异常。通过快捷键(ctrl+h)查看
5 声明异常
5.1 throws
在Java语言中通过throws声明某个方法可能抛出的各种异常。
当方法的定义者在定义方法时知道调用该方法时可能出现异常,定义者又不知道如何处理时,此时方法 定义者可以选择声明异常,使用throws关键字,可以声明多个异常,用( , )号分隔。形式:
| [修饰符] 返回值类型 方法名(形参列表) throws 异常1,异常2,...{ } |
需求1:声明异常
| public class Test01Throws { // divide方法可能有异常,但divide处理不了该异常,就通过throws声明异常,让divide方法的调 用者来处理 public static void divide(int a, int b) throws Exception { System.out.println(a / b); } public static void main(String[] args) { try { divide(3, 1); divide(1, 0);// 调用divide方法,调用者必须处理或再次抛出 } catch (Exception e) { e.printStackTrace(); } } } |
声明异常的原因:该方法自身处理不了该异常,只能使用throws提醒该方法的调用者需要处理异常。当
然调用者也有两种处理方式: 自己捕获处理或再次声明(要么try...catch ,要么也throws)。
需求2:异常继续上抛
| public class Test01Throws { public static void main(String[] args) throws Exception{ // 调用divide方法,调用者必须处理或再次抛出 divide(1, 0); } //divide方法可能有异常,但divide处理不了该异常,就抛出,让divide方法的调用者来处理 public static void divide(int a, int b) throws Exception { System.out.println(a / b); } } |
在异常声明或者上抛出的过程中,应该遵循以下原则:能在调用处明确处理优先处理,否则继续上抛。
声明异常时要根据异常的分类来确定是否外界(调用处)是否必须处理该方法产生的异常。如果需要外界必 须处理,需要声明检查时异常,否则声明运行时异常。
6 手动抛出异常 throw
在实际开发过程中,开发者也可以根据程序的需要,手动抛出异常,通过throw关键字。语法
| XxException ex = new XxException(); throw ex; 或者 throw new XxException(); |
当程序出现某种逻辑问题时由程序员主动抛出某种特定类型的异常。
| public class ThrowDemo { public static void main(String[] args) { try { ThrowDemo.isExist("will"); } catch (Exception e) { System.out.println(e.getMessage());//对不起,用户名will已经存在 } } public static boolean isExist(String userName) throws Exception { String[] data = { "will", "lucy", "lily" }; // 模拟已经注册的用户名 if (userName != null && userName.length() > 0) { for (String name : data) { if (name.equals(userName)) {// 用户名相同,证明该用户已经存在 // 手动抛出一个异常表示存在的不正常情况 throw new Exception("对不起,用户名" + userName + "已经存在"); } } } return false; } } |
7 自定义异常
当JDK 中的异常类型不能满足程序的需要时(也即需要定义具体的业务异常时),可以自定义异常。
自定义异常的步骤
[1] 确定异常类型(编译时异常、运行时异常)。
[2] 继承异常的父类(编译时异常Exception、运行时异常RuntimeException)
[3] 声明构造方法
public class Student {
private String name;
private int age;public Student(String name, int age) {
this.name = name;
this.setAge(age);
}public Student() { }public String getName() {
return name;
}public void setName(String name) {
this.name = name;
}public int getAge() {
return age;
}public void setAge(int age) throws AgeException{
if( age < 0 || age > 120 ) {
// System.out.println("年龄值不合法");
// 能否手动抛出一个年龄异常呢?
AgeException ex = new AgeException("年龄值不能小于0或者不能大于120"); throw ex;
} else {
this.age = age;
}
}
}
测试
| public class CustomExceptionDemo { public static void main(String[] args) { Student s1 = new Student("二狗",20); try { s1.setAge(130); } catch (AgeException e) { // System.out.println(e.toString()); System.out.println(e.getMessage()); } } } |
相关文章:
Java异常机制
1.异常概述和异常处理机制 异常(exception)概述 异常就是程序在运行时出现的意外的,不正常的情况。 若异常产生后没有正确的处理,会导致程序的中断,程序不继续执行,以致造成损失。 2.2 异常处理机制 所以我们在开发中要一套机制来处理各种可能…...
Aws EC2,kubeadm方式安装kubernetes(k8s)
版本 docker版本:20.10.25 k8s版本(kubeadm,kubelet和kubectl):1.20.10-0 初始化 # 禁用 SELinux sudo setenforce 0 sudo sed -i s/^SELINUXenforcing$/SELINUXpermissive/ /etc/selinux/config# 关闭防火墙 sudo …...
python 比较 mysql 表结构差异
最近在做项目的时候,需要比对两个数据库的表结构差异,由于表数量比较多,人工比对的话需要大量时间,且不可复用,于是想到用 python 写一个脚本来达到诉求,下次有相同诉求的时候只需改 sql 文件名即可。 com…...
【RAG入门教程01】Langchian框架 v0.2介绍
LangChain 是一个开源框架,旨在简化使用大型语言模型 (LLM) 创建应用程序的过程。可以将其想象成一套使用高级语言工具进行搭建的乐高积木。 它对于想要构建复杂的基于语言的应用程序而又不必管理直接与语言模型交互的复杂性的开发人员特别有用。它简化了将这些模型…...
python 做成Excel并设置打印区域
记录首次用python处理Excel表格的过程。 参考文章:https://www.jianshu.com/p/5e00dc2c9f4c 程序要做的事情: 1. copy 模板文件到 output 文件夹并重命名为客户指定的文件名 2. 从 DB 查询数据并将数据写入 Excel 3. 写数据的同时, 设置每…...
SpringAI(二)
大模型:具有大规模参数和复杂计算结构的机器学习模型.通常由深度神经网络构建而成,拥有数十亿甚至数千亿个参数.其设计目的在于提高模型的表达能力和预测性能,应对复杂的任务和数据. SpringAI是一个AI工程领域的应用程序框架 大概推出时间是2023年7月份(不确定) 目的是将S…...
小白都可以通过U盘重装系统,再也不用花50块钱去安装系统啦
下载Ventoy 软件 1、今天带着大家通过Ventoy 安装Windows 11 系统。 2、首先我们通过官网如下地址:https://www.ventoy.net/cn/,找到我们对应系统的Ventoy 软件安装包。 3、通过官网可以找到软件包的地址地址,如下图所示。 4、如下就是我下…...
android 双屏异显-学习笔记
双屏异显 日常生活中,有时候会遇到 Android 设备连接两个屏幕进行显示的问题,比如酒店登记信息时,一个屏幕用于员工操作,一个屏幕显示相关信息供顾客查看。这里就涉及到 Android 的双屏异显的问题,实现Android 的双屏异显,Google 也提供了相应的 API方法 Presentation。…...
Android Lottie 体积优化实践:从 6.4 MB 降到 530 KB
一、说明 产品提出需求:用户有 8 个等级,每个等级对应一个奖牌动画。 按照常用的实现方式: 设计提供 8 个 lottie 动画(8 个 json 文件)。研发将 json 文件打包进入 APK 中。根据不同等级播放指定的动画。 每一个 …...
Django前端页面-模板继承
通过模板的继承,可以将所有共同的前端页面移到母版,那么其他页面就可以用到母版了。 这是母版 <!DOCTYPE html> <html><head>{% block css %}{% endblock %}</head><body><h1>母版</h1><div><!-- …...
使用HTML、CSS和JavaScript编写一个注册界面(一)
倘若文章或代码中有任何错误或疑惑,欢迎提出交流哦~ HTML和CSS 首先,我们需要编写一个简洁的注册界面。 简单编写下,如下: 呈现效果为: <!DOCTYPE html> <html lang"en"><head><me…...
什么是档案数字化管理
档案数字化管理指的是将传统的纸质档案转换为数字形式,并通过电子设备、软件和网络技术进行管理和存储的过程。 档案数字化管理包括以下几个步骤: 1. 扫描和数字化:将纸质档案通过扫描仪转换为数字图像或文档。可以使用OCR(光学字…...
vuInhub靶场实战系列--prime:1
免责声明 本文档仅供学习和研究使用,请勿使用文中的技术源码用于非法用途,任何人造成的任何负面影响,与本人无关。 目录 免责声明前言一、环境配置1.1 靶场信息1.2 靶场配置 二、信息收集2.1 主机发现2.1.1 netdiscover2.1.2 nmap主机扫描2.1.3 arp-scan主机扫描 2.2 端口扫描…...
L48---1637. 两点之间不包含任何点的最宽垂直区域(排序)---Java版
1.题目描述 2.思路 (1)返回两点之间内部不包含任何点的 最宽垂直区域 的宽度。 我的理解是相邻两个点,按照等差数列那样,后一个数减去相邻的前一个数,才能保证两数之间不含其他数字。 (2)所以&…...
在线渲染3d怎么用?3d快速渲染步骤设置
在线渲染3D模型是一种高效的技术,它允许艺术家和设计师通过互联网访问远程服务器的强大计算能力,从而加速渲染过程。无论是复杂的场景还是高质量的视觉效果,在线渲染服务都能帮助您节省宝贵的时间。 在线渲染3D一般选择的是:云渲染…...
《软件定义安全》之二:SDN/NFV环境中的安全问题
第2章 SDN/NFV环境中的安全问题 1.架构安全 SDN强调了控制平面的集中化,从架构上颠覆了原有的网络管理,所以SDN的架构安全就是首先要解决的问题。例如,SDN实现中网络控制器相关的安全问题。 1.1 SDN架构的安全综述 从网络安全的角度&…...
Qt图表类介绍
本文主要介绍QCharts相关的模块及类。 Qt中图表模块有以下几种类型:折线图,样条曲线图,面积图,散点图,条形图,饼图,方块胡须图,蜡烛图,极坐标图。 QCharts的图表框架类似…...
时隔很久运行苍穹外卖项目,出现很多错误
中途运行了很多其他项目,maven的配置文件还被我修改了一次。导致再次运行苍穹外卖项目出现很多错误。 发现没有办法,把本地的仓库删了个干干净净。然后点击clean发现报错: Cannot access alimaven (http://mavejavascript:void(0);n.aliyun.…...
补篇协程:协程(Coroutine)里通过挂起suspend函数实现异步IO操作
异步IO的概念 异步IO是一种非阻塞的数据读写方法,异步IO与同步IO相对。 当一个异步过程调用发出后,调用者不能立刻得到结果。 实际的IO处理部件在完成操作后,会通过状态、通知或回调机制来通知调用者。 在一个CPU密集型的应用中,…...
qmt量化交易策略小白学习笔记第16期【qmt编程之获取北向南向资金(沪港通,深港通和港股通)】
qmt编程之获取北向南向资金 qmt更加详细的教程方法,会持续慢慢梳理。 也可找寻博主的历史文章,搜索关键词查看解决方案 ! 北向南向资金(沪港通,深港通和港股通) #北向南向资金交易日历 获取交易日列表…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...
【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...
Ubuntu系统复制(U盘-电脑硬盘)
所需环境 电脑自带硬盘:1块 (1T) U盘1:Ubuntu系统引导盘(用于“U盘2”复制到“电脑自带硬盘”) U盘2:Ubuntu系统盘(1T,用于被复制) !!!建议“电脑…...
