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…...
DAMOYOLO-S数据库联动应用:检测结果自动化存储与查询
DAMOYOLO-S数据库联动应用:检测结果自动化存储与查询 你有没有遇到过这样的场景?一个智能安防摄像头,每天24小时不间断地运行,DAMOYOLO-S模型在里面兢兢业业地识别着每一个经过的人和车。但问题是,这些宝贵的检测结果…...
傅里叶级数7大核心性质详解:从时移特性到微分性快速掌握
傅里叶级数7大核心性质详解:从时移特性到微分性快速掌握 信号与系统课程中,傅里叶级数就像一把瑞士军刀,能将复杂的周期信号拆解成简单的正弦波组合。对于备考学生而言,掌握其核心性质不仅能快速解题,更能深入理解信号…...
Phi-4-Reasoning-Vision保姆级教程:Streamlit界面响应式设计与GPU状态反馈
Phi-4-Reasoning-Vision保姆级教程:Streamlit界面响应式设计与GPU状态反馈 1. 工具概览 Phi-4-Reasoning-Vision是基于微软最新多模态大模型开发的专业级推理工具,专为双卡4090环境优化设计。这个工具能让开发者轻松体验15B参数大模型的强大推理能力&a…...
2026年服装收银软件选型指南:五大功能决定门店提效与增长
很多服装门店都遇到过这样的困境:网络波动导致无法收款,眼睁睁看着顾客放下衣服离开;促销规则设置不到位,收银时算错优惠引发客诉;活动结束了,线上线下数据对不上,投入的钱看不到效果。这些问题…...
VScode集成openClaw使用OpenClaw Node for VS Code插件(右键没有openClaw)
VSCode 右键没有 OpenClaw,大多是 插件没装对、服务没启动、连接失败、或菜单被隐藏 导致。按下面步骤一步步修复,100% 能出来。一、先确认:你装的是正确插件(最常见坑)OpenClaw 有两个 VSCode 插件,只有这…...
RTX 50系显卡用户看过来:在Windows上为CUDA 12.8和PyTorch Nightly版安装Triton的实战记录
RTX 50系显卡用户看过来:在Windows上为CUDA 12.8和PyTorch Nightly版安装Triton的实战记录 当GeForce RTX 50系列显卡遇上PyTorch Nightly和CUDA 12.8,这可能是目前最前沿的AI开发环境组合。但官方文档和主流教程往往跟不上硬件迭代的速度,让…...
Open UI5 源代码解析之841:VerticalLayout.js
源代码仓库: https://github.com/SAP/openui5 源代码位置:src\sap.ui.layout\src\sap\ui\layout\VerticalLayout.js VerticalLayout 文件解析 本文围绕 VerticalLayout.js 在 OpenUI5 项目中的角色与实现展开,重点说明该控件在布局体系中的定位、元数据设计、渲染协作、…...
OpenClaw开源贡献:为SecGPT-14B开发检测插件全流程
OpenClaw开源贡献:为SecGPT-14B开发检测插件全流程 1. 为什么选择OpenClaw开发安全检测插件 去年冬天,当我第一次在本地部署SecGPT-14B模型时,就意识到这个专精网络安全领域的模型需要更贴近实际工作场景的交互方式。作为长期从事渗透测试的…...
SimpleScreenRecorder多线程架构设计:如何避免死锁并提升录制性能
SimpleScreenRecorder多线程架构设计:如何避免死锁并提升录制性能 【免费下载链接】ssr SimpleScreenRecorder, a screen recorder for Linux 项目地址: https://gitcode.com/gh_mirrors/ss/ssr SimpleScreenRecorder作为一款Linux平台下的专业屏幕录制工具&…...
代码随想录算法第五十三天| KamaCoder110字符串迁移、KamaCoder105有向图的完全联通、KamaCoder106海岸线的计算
KamaCoder 110 字符串迁移 题目链接:110.字符串迁移 文档讲解:代码随想录 视频讲解: 字符串迁移 思路与感想:直接卡在读懂题意这一关了,我还纳闷输出结果怎么跟自己理解的差那么多。卡哥讲完之后才明白题目的推导过程…...



