Java学习【认识异常】
Java学习【认识异常】
- 认识异常
- 异常的种类
- 异常的作用
- 异常的处理方式
- JVM默认的处理方式
- 捕获异常
- finally
- 多个异常的处理
- 异常中的方法
- 抛出异常
- 自定义异常
认识异常
在Java中,将程序执行过程中发生的不正常行为称为异常
异常的种类
Error代表的是系统级别的错误,属于严重的问题
Exception叫做异常,代表程序可能出现的问题,通常用Exception和它的子类来封装程序所出现的问题
运行时异常: RuntimeException及其子类,编译阶段不会出现问题,运行时出现异常(例如数组越界异常)

编译时异常: 编译阶段就会出现异常提醒
例如之前写的克隆接口练习,出现的异常就属于编译时异常,编译阶段必须手动进行处理,

异常的作用
1.用来查询bug信息
通过异常的类型我们可以很快的发现程序的错误类型
当运行以下代码时:
class Student{private String name;private int age;public Student(String str){String[] strs = str.split("-");this.name = strs[0];this.age = Integer.parseInt(strs[1]);}public Student(String name,int age){this.name = name;this.age = age;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}
}
public class Text {public static void main(String[] args) {Student student1 = new Student("张三,20");System.out.println(student1);}
}

出现了数组越界的异常,通过这些可以定位到出现异常的位置
String[] strs = str.split("-");//应该改为用","分割
2.可以作为方法内部的一种特殊返回值,以便通知调用者底层的执行情况
例如当需要获取一个10~20的数字时,如果直接把不符合要求的情况打印在控制台上,这样调用处就无法得到具体的数是什么

此时就可以通过返回异常来解决:

异常的处理方式
JVM默认的处理方式
把异常的名称,异常的原因及出现的位置等信息输出在控制台
程序停止,下面的代码不会被执行
System.out.println("哈哈");
System.out.println(2/0);//出现异常
System.out.println("呵呵");
异常后面的内容并没有被执行

捕获异常
格式:
try{
可能出现异常的代码;
}catch(异常类名 变量名){
异常的处理代码;
}
public static void main(String[] args) {int[] arr = {1, 2, 3};try {System.out.println(arr[5]);/*此处出现了异常,程序在这里就会创建一个 ArrayIndexOutOfBoundsException对象用这个对象和catch里面比较,看括号中的变量是否可以接收这个对象如果能接收,就表示异常被捕获,接着执行catch里面的代码之后再执行catch下面的代码*/}catch (ArrayIndexOutOfBoundsException e){System.out.println("数组越界异常");}System.out.println("程序继续执行");}
通过捕获异常的方式处理,后续的代码是可以正常执行的

如果try中没有遇到问题,就会把try里的代码全部执行一遍,catch里面的代码并不会被执行
finally
try {
// 尝试执行的代码块
// 如果这里发生异常,则控制流会立即跳转到相应的catch块
} catch (ExceptionType1 e) {
// 处理ExceptionType1类型的异常的代码块
} finally {
// 无论是否发生异常,都会执行的代码块
// 通常用于执行清理操作,如关闭文件、数据库连接等
}
finally块里的语句,无论是否发生异常,都会执行,使用finally块的一个常见场景是确保资源(如文件句柄、网络连接或数据库连接)在使用后被正确关闭。即使发生异常,这些资源也需要在程序继续之前被释放。通过使用finally块,可以确保无论是否发生异常,这些资源都会被正确管理。

所以,对于这个方法,最终的返回值是finally里的2
多个异常的处理
当同时存在多个异常的时候,就要写多个catch与之对应
public static void main(String[] args) {try {String str = null;str.split("");System.out.println(2/0);}catch (NullPointerException e){System.out.println("空指针异常");}catch (ArithmeticException e){System.out.println("算术异常");}System.out.println("程序继续执行");}
注意: 如果异常中存在继承关系,子类要写在父类之前,不然所有的异常都会被父类捕获,程序报错

把父类写在最下面就可以了:

如果try中遇到的问题没有被捕获,最终还是会交给虚拟机处理
之后就会用虚拟机默认的处理方式,打印在控制台上:
如果try中出现的问题被捕捉到了,那么出现问题的下面就不会继续被执行
try {System.out.println(arr[10]);System.out.println("这里之后不会执行");System.out.println(2/0);} catch (ArrayIndexOutOfBoundsException e) {System.out.println("数组越界异常");} catch (NullPointerException e) {System.out.println("空指针异常");} catch (ArithmeticException e) {System.out.println("算术异常");}
所以后面的算术异常也不会被捕捉到
异常中的方法
通过快捷键ctrl + alt + t 可以快速生成 try-catch语句

public String getMessage(): 返回throwable的详细信息字符串

public String toString(): 返回此可抛出的简短描述

public void printStackTrace(): 把异常的错误信息输出在控制台上

printStackTrace方法打印的信息包含了getMessage()和toString()的信息,也最为常用
抛出异常
throws: 写在方法定义处,表示声明一个异常,告诉调用者,使用此方法可能会有哪些异常
public void方法名() throws 异常类名1,异常类名2{ ···· }
编译时异常:必须要写
运行时异常:可以不写
throw: 写在方法内,表示结束方法,用来手动抛出异常对象,交给调用者处理,方法中下面的代码不再执行
public void 方法(){
throw new 异常对象();
}
区别:
throwthrow关键字用于在方法中抛出一个异常,throws关键字用于声明一个方法可能会抛出的异常,本身并不抛出异常,它只是一个声明,告诉方法的调用者这个方法在执行过程中可能会抛出哪些异常
自定义异常
创建自定义异常类:
声明一个继承自Exception类或其子类的类,作为自定义异常类。
根据需要添加构造方法和其他方法。例如,可以添加一个带有错误消息的构造方法,以便在抛出异常时提供有关异常的详细信息。
当直接继承Exception类来创建自定义异常时,创建的是一个受检异常。受检异常是那些必须在方法签名中使用throws关键字声明,并且在调用该方法的地方使用try-catch块捕获或继续向上抛出的异常。编译器会强制要求这样做,以确保处理了所有可能的异常情况
public class MyCustomException extends Exception { public MyCustomException() { super(); } // 带字符串消息的构造函数 public MyCustomException(String message) { super(message); } }
继承RuntimeException类,表示的是运行时发生的异常。RuntimeException和其子类被视为未受检异常。未受检异常不需要在方法签名中声明,编译器也不会强制要求你捕获它们。
public class PassWordException extends RuntimeException{public PassWordException() {}public PassWordException(String message) {super(message);}
}
之后的使用方法和Java中的异常是一样的,这里给出一个登录系统的示例:
public class Login {private String username;private String password;public Login() {}public Login(String username, String password) {this.username = username;this.password = password;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public void Loginfo(String username,String password)throws UserNameException,PassWordException{if(!this.username.equals(username)){throw new UserNameException("用户名不存在");}if(!this.password.equals(password)){throw new PassWordException("密码错误");}System.out.println("登录成功");}public static void main(String[] args) {Login login = new Login();while (true) {try {System.out.println("请输入用户名");String username = new Scanner(System.in).nextLine();login.setUsername(username);System.out.println("请输入密码");String password = new Scanner(System.in).nextLine();login.setPassword(password);login.Loginfo("admin","123");break;} catch (UserNameException e) {e.printStackTrace();} catch (PassWordException e) {e.printStackTrace();}}}
}
相关文章:
Java学习【认识异常】
Java学习【认识异常】 认识异常异常的种类异常的作用 异常的处理方式JVM默认的处理方式捕获异常finally 多个异常的处理异常中的方法抛出异常 自定义异常 认识异常 在Java中,将程序执行过程中发生的不正常行为称为异常 异常的种类 Error代表的是系统级别的错误&a…...
uniapp+h5 ——微信小程序页面截屏保存在手机
web-view 需要用到 web-view ,类似于iframe, 将网页嵌套到微信小程序中,参数传递等; 示例(无法实时传递数据),页面销毁时才能拿到h5传递的数据,只能利用这点点击跳转到小程序另一个…...
三、基于图像分类预训练编码及图神经网络的预测模型 【框图+源码】
背景: 抽时间补充,先挖个坑。 一、模型结构 二、源码...
Linux - 高级IO
目录 理解五种IO模型非阻塞IO的设置多路转接之select 实现一个简易的select服务器select服务器的优缺点 多路转接之poll 实现一个简易的poll服务器poll服务器的优缺点 多路转接之epoll epoll原理epoll的优势用epoll实现一个简易的echo服务器 epoll的LT和ET工作模式 什么是LT和…...
面试题:说一下 http 报文都有哪些东西?
面试题:说一下 http 报文都有哪些东西? HTTP 是传输超文本(实际上除了 HTML,可以传输任何类型的文件,如视频、音频、文本等)的协议,是一组用于浏览器-服务器之间数据传输的规则。 HTTP 位于 OS…...
开山之作!Python数据与算法分析手册,登顶GitHub!
若把编写代码比作行军打仗,那么要想称霸沙场,不能仅靠手中的利刃,还需深谙兵法。 Python是一把利刃,数据结构与算法则是兵法。只有熟读兵法,才能使利刃所向披靡。只有洞彻数据结构与算法,才能真正精通Pyth…...
编译安装gcc-11及可能遇到的bug
编译安装脚本 GCC_VERSION11.1.0 PACKAGE_DIR/path/to/gcc/source/code GCC_DIR$PACKAGE_DIR/gcc-$GCC_VERSION GCC_INSTALL_DIR/path/to/install/gccmkdir -p $GCC_INSTALL_DIR cd $GCC_INSTALL_DIR rm -rf * cd $PACKAGE_DIR rm -rf gcc-$GCC_VERSION if [ ! -f "gcc-$…...
vue项目引入json/js文件批量或单个方法
vue项目 json // 方式一 : 将文件内容完整的引入 import json from ./src/assets/xxx.json console.log(json) console.log(---)// 方式二 : 部分引入-名称必须是文件中定义的key import {name1,name2} from ./src/assets/xxx.json console.log(name1)…...
守护任务用来防止资源冲突
背景:有三个任务,他们都需要操作数码管。每个任务对应三个数码管,共9个数码管。硬件上9个数码管的控制使用一套硬件完成。 策略:每个任务都往自己的队列里面发数据,单独建立一个监听任务:处理所有队列的数…...
fast admin实现多数据库导入数据
思路 1创建多数据库连接 2后端的前台代码能使用get或者post请求传递选中数据给后台 3后台能够接收到 4后台接收到id或者全字段数据后对数据进行处理,然后使用多数据库操作将其存入第二个数据库 实现 1config文件下创建新数据库连接 db_config2 > [// 数据库类…...
NLP基础——序列模型(动手学深度学习)
序列模型 定义 序列模型是自然语言处理(NLP)和机器学习领域中一类重要的模型,它们特别适合处理具有时间顺序或序列结构的数据,例如文本、语音信号或时间序列数据。 举个例子:一部电影的评分在不同时间段的评分可能是…...
机器学习AI大模型的开源与闭源:哪个更好?
文章目录 前言一、开源AI模型1.1 开源的优点1.2 开源的缺点 二、闭源AI模型2.1 闭源的优点2.2 闭源的缺点 三、开源与闭源的平衡3.1 开源与闭源结合的案例3.2 开源与闭源的战略选择 小结 前言 在过去的几年里,人工智能(AI)和机器学习…...
关于大模型多轮问答的两种方式
前言 大模型的多轮问答难点就是在于如何精确识别用户最新的提问的真实意图,而在常见的使用大模型进行多轮对话方式中,我接触到的只有两种方式: 一种是简单地直接使用 user 和 assistant 两个角色将一问一答的会话内容喂给大模型,…...
达梦数据库相关SQL及适配Mysql配置总结
🍓 简介:java系列技术分享(👉持续更新中…🔥) 🍓 初衷:一起学习、一起进步、坚持不懈 🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏 🍓 希望这篇文章对你有所帮助,欢…...
Centos7.9实现多台机器ssh免密登录
1.本机(172.16.10.228)先生成密钥对 ssh-keygen -t rsa 2.执行命令,把本机公钥拷贝到远程机器 ssh-copy-id rootdistinctIp 3.查看一下远程机器 、/root/.ssh/authorized_keys文件 cat /root/.ssh/authorized_keys 会看到里边多了个公钥…...
Unity3D DOTS JobSystem物理引擎的使用详解
前言 Unity3D DOTS(Data-Oriented Technology Stack)是Unity引擎的一项新技术,旨在提高游戏性能和扩展性。其中的Job System是一种用于并行处理任务的系统,可以有效地利用多核处理器的性能。在本文中,我们将重点介绍如…...
vue3+element-plus 表单校验和循环form表单校验
1.HTML页面 //el-form 标签添加上 ref"form2Form" :rules"rules2" :model"form2" 正常表单校验 //没有循环表单的使用事例<el-form-item label"投保人名称" class"insurance-date-no1" prop"tbrName">…...
Java集合基础知识点系统性总结篇
目录 集合一、图解集合的继承体系?([图片来源](https://www.cnblogs.com/mrhgw/p/9728065.html))点击查看大图二、List,Set,Map三者的区别?三、List接口的实现3.1、Arraylist 、 LinkedList、Vector3.2、Arraylist 、 LinkedList、…...
智能网联汽车信息安全风险识别与应对策略研究综述
摘要:随着智能网联汽车技术的飞速发展,其信息安全问题逐渐成为公众关注的焦点。本文概述了智能网联汽车技术的发展背景和信息安全风险的来源,采用STRIDE威胁分析方法对智能网联汽车的四层模型进行风险识别,进一步探讨了抗女巫攻击…...
python-web应用程序-Django数据库-数据库表设计
python-web应用程序-Django数据库-数据库表设计 在models中创建一个类会自动对数据库进行管理,那么如何用类的声明来实现数据库表的设计呢? from django.db import models# Create your models here. class Department(models.Model):title models.Ch…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...
iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...



