12. Java异常及异常处理处理
Java —— 异常及处理
- 1. 异常
- 2. 异常体系
- 3. 常见Exception
- 4. 异常处理
- 4.1 try finally catch关键字
- 4.2 throws和throw 自定义异常
- 4.3 finally,final,finalize三者的区别
1. 异常
| 异常:在程序执行过程中发生的意外状况,可能导致程序中断或产生错误结果 异常对象:java(面向对象)将错误用类来描述,一旦程序执行错误,将会创建对应的错误对象(用以向程序员或用户展示错误原因等) 异常处理的意义:提高代码的健壮性和可靠性,使程序可以处理非预期的情景,并且继续正常的处理 |
2. 异常体系
| 异常超类:Thorwable类(表示可抛出)是所有异常和错误的超类 异常的两个子类:Exception异常类,Error错误异常类 Exception程序捕捉处理的异常:表示由于网络故障、文件损坏、设备错误、用户输入非法等情况导致的异常 Error系统错误:表示Java运行时环境出现的错误(JVM内存资源耗尽) |
- java异常体系图

Throwable的父类也是Object,继承其父类的 getClass()和getName()方法
- 常用方法
// 返回抛出异常的详细信息
public string getMessage();
public string getLocalizedMessage();
//返回异常发生时的简要描述
public public String toString()
//打印异常信息到标准输出流上
public void printStackTrace();
public void printStackTrace(PrintStream s);
public void printStackTrace(PrintWriter s)
//记录栈帧的的当前状态
public synchronized Throwable fillInStackTrace();
package exception;/*** 常见使用方法*/
public class ExceptionAPI {public static void main(String[] args) {System.out.println("程序开始!");try {String line = "1i0";System.out.println(Integer.parseInt(line));} catch (NumberFormatException e) {// 显示红色报错信息e.printStackTrace();// 获取错误信息System.out.println("错误信息:" + e.getMessage());System.out.println("错误信息Localized:" + e.getLocalizedMessage());System.out.println("简要描述:" + e.toString());System.out.println("当前状态:" + e.fillInStackTrace());}System.out.println("结束");}
}
3. 常见Exception
| Exception的两类异常:RuntimeException运行时异常(非受控),CheckedException编译时异常(受控) |
常见UncheckedException异常
| 异常 | 异常描述 |
|---|---|
| ArrayIndexOutOfBoundsException | 数组越界异常 |
| NulPointerException | 空指针异常 |
| llegalArgumentException | 非法参数异常 |
| NegativeArraySizeException | 数组长度为负异常 |
| llegalStateException | 非法状态异常 |
| ClassCastException | 类型转换异常 |
常见RuntimeException异常
| 异常 | 异常描述 |
|---|---|
| NoSuchFieldException | 表示该类没有指定名称抛出来的异常 |
| NoSuchMethodException | 表示该类没有指定方法抛出来的异常 |
| llegalAccessException | 不允许访问某个类的异常 |
| ClassNotFoundException | 类没有找到抛出异常 |
4. 异常处理
4.1 try finally catch关键字
组合:
try...catch对某一段代码可能抛出异常进行的捕获
try...finally对一段代码不管执行情况如何,都会走finally中的代码
try...catch...finally对异常捕获后,再走fimally中的代码逻辑
- 异常处理过程:一般是子类型在前,超类型在后
对指定代码内容添加一定包围功能(try…finally)快捷键:ctrl+alt+t
try…catch
package exception;
/*** java异常处理机制* java异常超类:Throwable* 两个子类:Error,表示系统级别错误*/
public class TryCatch {public static void main(String[] args) {System.out.println("程序开始执行!");// try catch异常处理try{String line = "";
// String line = null;System.out.println(line.length());System.out.println(line.charAt(0));} catch (NullPointerException e){// 程序没有异常就不会执行该异常处理System.out.println("异常:空指针异常!");} catch (StringIndexOutOfBoundsException e){// try中的代码执行捕获到第一个异常之后,直接跳到相应的处理机制,后面的异常将不再执行System.out.println("异常:索引超出范围!");} catch (NoSuchFieldError | StackOverflowError e){// 多个异常的相同处理机制System.out.println("发生异常!");} catch (Exception e){// 超类异常(多种异常,超类异常一般写在最后)System.out.println("出错!");}System.out.println("执行完毕!");}
}
try…catch…finally
package exception;import java.io.FileOutputStream;
import java.io.IOException;/*** finally 关键字用来创建在 try 代码块后面执行的代码块* 无论是否发生异常,finally 代码块中的代码总会被执行* 在 finally 代码块中,可以运行清理类型等收尾善后性质的语句** @author LongYongchuan*/
public class FinallyDemo {public static void main(String[] args) {System.out.println("程序开始!");try{String line = "11";System.out.println(line.length());} catch (Exception e) {System.out.println("出错了!");} finally {System.out.println("finally");}System.out.println("程序结束!");FileOutputStream fos = null;try {fos = new FileOutputStream("./document/fos.txt");fos.write(5);} catch (IOException e) {throw new RuntimeException(e);} finally {try {fos.close();} catch (IOException e) {throw new RuntimeException(e);}}}
}
编译器的自动关闭特性(只是编译器认可)
- 只有实现了AutoCloseable接口的类才能在try后面加(进行初始化),java中所有流都实现了该接口
package exception;import java.io.FileOutputStream;
import java.io.IOException;public class AutoClose {public static void main(String[] args) {// 编译器优化代码(只有实现了AutoCloseable接口的类)try (// 初始化FileOutputStream fos = new FileOutputStream("./document/fos.dat")) {fos.write(1);} catch (IOException e) {e.printStackTrace();}}
}
4.2 throws和throw 自定义异常
Java中,异常就是一个对象,它能够被程序员自定义抛出或者应用程序抛出,必须借助于throws和throw 语句来定义抛出异常
throws和throw通常是成对出现的:
throws 语句用在方法声明后面,表示再抛出异常,由该方法的调用者来处理,抛出一个异常实例
throw语句用在方法体内,表示抛出异常,由方法体内的语句处理
- 自定义异常
- Java异常机制可以保证程序更安全和更健壮,虽然Java类库已经提供很多可以直接处理异常的类,但是有时候为了更加精准地捕获和处理异常以呈现更好的用户体验,需要开发者自定义异常
- 自定义异常
1.类名要做到见名知义
2.必须继承自Exception(直接或间接继承)
3.提供从超类异常定义的所有构造器
1. throw和throws通常成对出现(单独的throw对Exception时编译不通过,需要使用throws在方法上对异常抛出处理)
2. 一般RuntimeException和throw使用,其他异常需结合throw和throws使用,一般不要在main方法上抛出异常(不负责的体现)
3. 方法中出现throw异常时,throw后面的代码将不执行,而直接进入异常处理机制
- 自定义异常
package exception;public class IllegalAgeException extends Exception{// alt+insert键生成public IllegalAgeException() {}public IllegalAgeException(String message) {super(message);}public IllegalAgeException(String message, Throwable cause) {super(message, cause);}public IllegalAgeException(Throwable cause) {super(cause);}public IllegalAgeException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {super(message, cause, enableSuppression, writableStackTrace);}
}
- 抛出异常
package exception;public class Person{private String name;private int age;private char gender;private String[] otherInfo;public Person() {}public Person(String name, int age, char gender, String[] otherInfo) {this.name = name;this.age = age;this.gender = gender;this.otherInfo = otherInfo;}public String getName() {return name;}// 异常处理throws关键字(使用在方法声明之后,抛出异常处理,该异常由方法调用者处理)public void setName(String name){if (name.length() <= 0 || name.length() >= 5){// throw和throws通常成对出现(单独的throw对Exception时编译不通过,需要使用throws在方法上对异常抛出处理)throw new RuntimeException("名字长度不符合汉文名字");}this.name = name;}public int getAge() {return age;}public void setAge(int age) throws IllegalAgeException{// 抛出异常throw关键字if (age < 0 || age >100){// 一般RuntimeException和throw使用,其他异常需结合throw和throws使用throw new IllegalAgeException("年龄不合法");// 出现异常时,throw相当于return直接结束,不执行this.age = age;}this.age = age;System.out.println("年龄:" + age);}public char getGender() {return gender;}public void setGender(char gender) {this.gender = gender;}public String[] getOtherInfo() {return otherInfo;}public void setOtherInfo(String[] otherInfo) {this.otherInfo = otherInfo;}}
- 异常处理
package exception;/*** throw关键字*/
public class ThrowDemo {// 一般不要在main方法上抛出异常public static void main(String[] args){Person person = new Person();// throw单独的异常一般不必须抛出person.setName("萨克");// 使用throw和throws抛出的异常必须处理try {// 方法调用者处理异常person.setAge(50);} catch (IllegalAgeException e) {throw new RuntimeException(e);}System.out.println("此人姓名:" + person.getName());}
}
注:
允许子类方法抛出父类方法的部分异常
允许子类方法不再抛出异常
允许子类方法抛出父类方法声明的子类型异常
不允许子类方法抛出额外异常
不允许子类方法抛出父类方法声明异常的超类型异常
4.3 finally,final,finalize三者的区别
finally关键字用于定义在 try-catch 语句块中始终执行的代码块final关键字用于修饰类、方法和变量,分别表示最终类、最终方法和常量finalize()方法是 Object 类中的方法,用于对象在被垃圾回收前进行资源清理的操作
finally:finally是 Java 中的一个关键字,用于定义在 try-catch 语句块中的一个代码块。无论是否发生异常,finally代码块始终会被执行(常用于进行清理工作,例如关闭文件、释放资源等)
try {// 可能引发异常的代码
} catch (Exception e) {// 异常处理逻辑
} finally {// 始终会执行的代码,用于清理工作
}
final:final是用来修饰类、方法和变量的关键字
- 当用
final修饰一个类时,表示该类不能被继承,即该类为最终类- 当用
final修饰一个方法时,表示该方法不能被子类重写,即该方法为最终方法- 当用
final修饰一个变量时,表示该变量的值不能被修改,即该变量为常量
final class FinalClass {// 最终类,不能被继承
}class SuperClass {final void finalMethod() {// 最终方法,不能被重写}
}public class Example extends SuperClass {// 尝试重写finalMethod()会导致编译错误
}class MyClass {final int MAX_VALUE = 10; // 常量,不能被修改
}
finalize():finalize()是 Object 类中的一个方法,用于在对象被垃圾回收前进行资源清理的操作。当垃圾回收器准备回收一个对象时,会先调用其finalize()方法(如果该对象重写了该方法),然后才对其进行垃圾回收。通常用于释放非Java堆内存资源,如关闭文件、释放连接等。但是,它已经过时,不推荐使用。
class MyClass {@Overrideprotected void finalize() throws Throwable {// 对象的资源清理操作}
}
相关文章:
12. Java异常及异常处理处理
Java —— 异常及处理 1. 异常2. 异常体系3. 常见Exception4. 异常处理4.1 try finally catch关键字4.2 throws和throw 自定义异常4.3 finally,final,finalize三者的区别 1. 异常 异常:在程序执行过程中发生的意外状况,可能导致程…...
自定义hooks函数
体会1 1、js文件中定义useXX函数 export function usetestY() {const count ref(10);const doubleCount computed(() > count.value * 2);return {count,doubleCount,}; } 2、在vue文件中使用useXX函数 import { usetestY } from ./data;const { count, doubleCount } …...
Linux系统及Docker安装RabbitMq
目录 一、linux系统安装 1、上传文件 2、在线安装依赖环境 3、安装Erlang 4、安装RabbitMQ 5、开启管理界面及配置 6、启动 7、删除mq 二、docker安装 1、上传mq.tar包或使用命令拉取镜像 2、启动并运行 3、访问mq 一、linux系统安装 1、上传文件 2、在线安装依赖环…...
山东省赛二阶段第一部分解题思路
提交攻击者的IP地址 192.168.1.7 这个直接awk过滤一下ip次数,这个ip多得离谱,在日志里面也发现了它的恶意行为,后门,反弹shell 识别攻击者使用的操作系统 Linux 找出攻击者资产收集所使用的平台 shodan 提交攻击者目…...
WebGoat 靶场 JWT tokens 四 五 七关通关教程
文章目录 webGoat靶场第 四 关 修改投票数第五关第七关 你购买书,让Tom用户付钱 webGoat靶场 越权漏洞 将webgoat-server-8.1.0.jar复制到kali虚拟机中 sudo java -jar webgoat-server-8.1.0.jar --server.port8888解释: java:这是用于执行…...
【单元测试】如何使用 JUnit5 框架?
JUnit5 单元测试框架使用教程 一、Junit5 是什么? Junit5是一个用于在Java平台上进行单元测试的框架。JUnit 5 框架主要由三部分组成:JUnit Platform、JUnit Jupiter 和 JUnit Vintage。 JUnit Platform:定义了测试引擎的 API,是…...
C#封装、继承和多态的用法详解
大家好,今天我们将来详细探讨一下C#中封装、继承和多态的用法。作为C#的三大面向对象的特性,这些概念对于程序员来说非常重要,因此我们将对每个特性进行详细的说明,并提供相应的示例代码。 目录 1. 封装(Encapsulati…...
数据结构与算法(持续更新)
线性表 单链表 单链表的定义 由于顺序表的插入删除操作需要移动大量的元素,影响了运行效率,因此引入了线性表的链式存储——单链表。单链表通过一组任意的存储单元来存储线性表中的数据元素,不需要使用地址连续的存储单元,因此它…...
HDLbits: ece241 2014 q4
module top_module (input clk,input x,output z ); reg [2:0] Q;always(posedge clk)beginQ[0] < Q[0] ^ x;Q[1] < (~Q[1]) & x;Q[2] < (~Q[2]) | x;z < ~(| Q[2:0]); //错误!!!!endendmodule 正确答案…...
LuatOS-SOC接口文档(air780E)-- gmssl - 国密算法
sm.sm2encrypt(pkx,pky,data)# sm2算法加密 参数 传入值类型 解释 string 公钥x,必选 string 公钥y,必选 string 待计算的数据,必选,最长255字节 返回值 返回值类型 解释 string 加密后的字符串, 原样输出,未经HEX转换 例子 local originStr "encryptio…...
【线性代数及其应用 —— 第一章 线性代数中的线性方程组】-1.线性方程组
所有笔记请看: 博客学习目录_Howe_xixi的博客-CSDN博客https://blog.csdn.net/weixin_44362628/article/details/126020573?spm1001.2014.3001.5502思维导图如下: 内容笔记如下:...
vue实现拖拽排序
在业务中列表拖拽排序是比较常见的需求,常见的JS拖拽库有Sortable.js,Vue.Draggable等,大多数同学遇到这种需求也是更多的求助于这些JS库,其实,使用HTML原生的拖放事件来实现拖拽排序并不复杂,结合Vue的tra…...
IS-IS
二、IS-IS中的DIS与OSPF中的DR Level-1和Level-2的DIS是分别选举的,用户可以为不同级别的DIS选举设置不同的优先级。DIS的选举规则如下:DIS优先级数值最大的被选为DIS。如果优先级数值最大的路由器有多台,则其中MAC地址最大的路由器会成为DI…...
【MySQL】为什么使用B+树做索引
MySQL的innoDB引擎使用的是B树的结构来存储索引的,那么为什么会使用B树呢?为什么不使用其他的结构?本篇我们深入MySQL底层来了解B树。本文中说到的MySQL都是InnoDB引擎的 在这之前,先了解一下InnoDB是如何存储数据的 MySQL是根据数据页的方式…...
php 安装mongodb扩展模块,rdkafka模块
mongodb mongodb扩展下载 选择php版本,根据报错提示,选择扩展对应的版本选择非安全进程将php_mongodb.dll放到php/ext目录下修改php.ini配置,添加extensionphp_mongodb.dll开启php_mongodb扩展,重启服务php -m 查看是否开启成功…...
【数据结构】初探时间与空间复杂度:算法评估与优化的基础
🚩纸上得来终觉浅, 绝知此事要躬行。 🌟主页:June-Frost 🚀专栏:数据结构 🔥该文章主要了解算法的时间复杂度与空间复杂度等相关知识。 目录: 🌏 时间复杂度🔭…...
SpringCloud Alibaba - Sentinel 限流规则(案例 + JMeter 测试分析)
目录 一、Sentinel 限流规则 1.1、簇点链路 1.2、流控模式 1.2.1、直接流控模式 1.2.2、关联流控模式 a)在 OrderController 中新建两个端点. b)在 Sentinel 控制台中对订单查询端点进行流控 c)使用 JMeter 进行测试 d)分…...
uniapp 条件编译 APP 、 H5 、 小程序
一、#ifdef、#ifndef、 #endif三者的区别、 标识作用#ifdef仅在某个平台上使用#ifndef在除了这个平台的其他平台上使用(非此平台使用)#endif结束条件编译 二、平台标识 标识平台APP-PLUS5AppMP微信小程序/支付宝小程序/百度小程序/头条小程序/QQ小程序MP-WEIXIN微…...
深度学习——权重衰减(weight_decay)
深度学习——权重衰减(weight_decay) 文章目录 前言一、权重衰减1.1. 范数与权重衰减1.2. 高维线性回归1.3. 从零开始实现1.3.1.初始化模型参数1.3.2. 定义L₂范数惩罚1.3.3. 定义训练代码实现1.3.4. 不管正则化直接训练1.3.5. 使用权重衰减 1.4. 简洁实现 总结 前言…...
nignx如何部署让前端不用清缓存就可以部署
在Nginx中,可以使用以下方法来部署前端应用程序,使前端用户无需清空缓存即可进行部署: 1、使用版本号:在前端应用程序的构建过程中,可以添加一个独特的版本号到应用程序的名称中。每次部署时,将版本号更新…...
免费AI聊天机器人部署指南:整合多模型与全栈技术实践
1. 项目概述与核心价值最近在折腾一些AI应用,发现很多朋友都想自己部署一个免费的、功能强大的聊天机器人,但要么被高昂的API费用劝退,要么被复杂的部署流程搞得头大。如果你也有同样的困扰,那么今天聊的这个项目——CNSeniorious…...
GTX 1660实战AI视频生成:低显存环境下的模型瘦身与帧插值方案
1. 项目概述:在入门级显卡上跑通AI视频生成最近看到不少朋友对AI视频生成很感兴趣,但总被“需要RTX 4090”、“至少24GB显存”这类硬件门槛劝退。作为一个常年混迹于“丐版”硬件圈的老玩家,我决定用我手头这块服役多年的GTX 1660(…...
【AI面试临阵磨枪-54】如何监控 AI 系统:成功率、延迟、Token 消耗、幻觉率、调用量
一、 面试题目面试官提问: “在大规模 Agent 系统中,你是如何建立监控体系的?请针对 成功率、延迟、Token 消耗、幻觉率、调用量 这五个核心指标,详细谈谈你的采集、分析与预警方案。”二、 知识储备1. 核心背景:AI 监…...
马斯克诉奥尔特曼案第三周:微软与 OpenAI 举证反击,争议焦点浮出水面
【案件进展概述】智东西 5 月 12 日消息,今天,马斯克诉奥尔特曼案进入第三周,被告方关键证人相继出庭,微软 CEO 萨提亚纳德拉 (Satya Nadella)、OpenAI 联合创始人兼前首席科学家 伊利亚苏茨克维 ÿ…...
轻量级AI智能体运行时Neko:边缘设备部署与自动化实践
1. 项目概述:为边缘设备而生的轻量级AI智能体运行时如果你和我一样,一直在寻找一个能在树莓派Zero 2W或者一台年费不到10美元的低配VPS上稳定运行的AI智能体框架,那么neko的出现,可能就是我们等待已久的那个答案。这个项目最吸引我…...
3分钟快速搞定Windows苹果设备驱动安装:Apple-Mobile-Drivers-Installer终极指南
3分钟快速搞定Windows苹果设备驱动安装:Apple-Mobile-Drivers-Installer终极指南 【免费下载链接】Apple-Mobile-Drivers-Installer Powershell script to easily install Apple USB and Mobile Device Ethernet (USB Tethering) drivers on Windows! 项目地址: h…...
反AI招聘平台hire-humans:重塑以人为本的招聘体验
1. 项目概述:当AI遇见“真人”招聘最近在GitHub上看到一个挺有意思的项目,叫“hire-humans”。光看名字,你可能会觉得这是个普通的招聘网站模板或者人力资源工具。但点进去仔细琢磨,你会发现它的内核远不止于此。这个项目本质上是…...
从硬盘拷贝文件到内存,CPU真的在‘摸鱼’吗?聊聊DMA背后的性能优化实战
从硬盘拷贝文件到内存,CPU真的在‘摸鱼’吗?聊聊DMA背后的性能优化实战 当你在服务器上执行一个简单的文件读取操作时,是否曾好奇过背后发生了什么?传统认知中,CPU需要亲自搬运每个字节的数据,但实际上现代…...
无人机雷达与LiDAR协同监测土壤湿度技术解析
1. 无人机雷达与LiDAR协同监测土壤湿度的技术原理在精准农业领域,土壤湿度监测一直面临着植被遮挡带来的技术挑战。传统的地面传感器网络虽然精度较高,但存在部署成本高、维护困难等问题;而光学遥感又难以穿透茂密的作物冠层。无人机载雷达与…...
【UWB-IMU、UWB定位】【UWB-IMU】融合仅具有测距和6轴IMU传感器数据的位置信息研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
