Java异常类

目录

Java异常类

Java中的异常体系

抛出异常

处理异常

处理异常的两种方式

try...catch和throws的区别

finally关键字

抛出异常注意事项

自定义异常类


Java异常类

Java中的异常体系

在Java中,异常类的父类为Throwable类,在Throwable下,存在两个子类:

  1. Error类:错误类,一般错误类中的错误都是致命错误,例如栈溢出错误StackOverflowError
  2. Exception类:异常类,一般是小型错误,例如数组越界ArrayIndexOutofBoundException

一般情况下Exception类是编译时异常,但是其中有一个特殊的异常RuntimeException,该异常为运行时异常,例如数组越界异常就属于RuntimeException

上面的体系可以参考下图:

抛出异常

在Java中,使用throw关键字抛出异常对象,基本格式如下:

throw new 异常类(<可选打印信息>);

例如下面的代码:

public class Test {public static void main(String[] args) {String s = "test.txt";method(s);}public static void method(String s) {if(!s.endsWith(".txt")) {throw new FileNotFoundException("文件不存在");}else {System.out.println("文件存在");}}
}

处理异常

处理异常的两种方式

在Java中一共有两种处理异常的方式:

  1. 使用throws关键字抛出当前方法中的异常,如果一个方法有多个异常抛出,可以使用,分隔不同的异常类,使用格式如下:
方法(形参列表) throws 异常类名1, 异常类2... {// 方法体throw new 异常对象名();
}// 例如
public static void method(String s) throws FileNotFoundException {if(!s.endsWith(".txt")) {throw new FileNotFoundException("文件不存在");}else {System.out.println("文件存在");}
}
  1. 使用try...catch捕获异常,使用try包裹可能出现异常的语句,catch捕获异常对象,catch语句可以不止一个,基本格式如下:
try{// 可能出现异常的语句
}
catch(异常类 异常对象名)
{// 处理语句
}
// 可以有多个catch语句

例如下面的代码:

public class Test {public static void main(String[] args) {String s = "test.txt1";try {method(s);} catch (FileNotFoundException e) {System.out.println(e);// 也可以使用下面的方式打印完整信息// e.printStackTrace();}}public static void method(String s) throws FileNotFoundException {if (!s.endsWith(".txt")) {throw new FileNotFoundException("文件不存在");} else {System.out.println("文件存在");}}
}

在处理异常时,如果抛出的异常类是另一个异常类的子类,那么可以使用throws向上抛出对应父类异常类,例如上面的FileNotFoundException属于父类IOException,所以可以抛出IOException或者Exception

同样,对于try...catch语句也是如此

public class Test {public static void main(String[] args) {String s = "test.txt1";try {method(s);} catch (Exception e) {System.out.println(e);}}public static void method(String s) throws IOException {if (!s.endsWith(".txt")) {throw new FileNotFoundException("文件不存在");} else {System.out.println("文件存在");}}
}

如果可能出现的异常语句在try中确实出现了异常,则当前try中出现异常的语句之后的语句不会再执行,否则正常执行,例如下面的代码:

public class Test {public static void main(String[] args) {String s = "test.txt1";try {method(s);System.out.println("出现异常时我不会出现");} catch (FileNotFoundException e) {System.out.println(e);}}public static void method(String s) throws IOException {if (!s.endsWith(".txt")) {throw new FileNotFoundException("文件不存在");} else {System.out.println("文件存在");}}
}输出结果:
java.io.FileNotFoundException: 文件不存在

try...catchthrows的区别

使用throws处理异常时,第一个出现异常的位置开始抛出异常,此时该方法不再执行剩余的代码,将异常向方法调用处抛,如果方法调用处依旧没有处理异常,则继续向上抛出,以此类推,如果最后一个调用处依旧没有处理,则此时JVM就会报错,打印对应的异常信息

使用try...catch处理异常时,如果catch可以捕获到try中的异常,则代表异常被正常处理,此时其他的catch将不会被执行(即从上而下依次匹配直到遇到合适的),但是不可以将父类异常放在子类异常前,否则编译报错,当正常处理完异常后,try...catch后面的语句将正常执行

finally关键字

finally关键字用于一定要执行的代码,放在最后一个catch之后,有了finally后,不论是否出现了异常,都会走finally中的语句,除非在可以捕获到对应异常的catch语句中使用了System.exit(0)(结束JVM虚拟机运行),例如下面的代码:

public class Test {public static void main(String[] args) {String s = "test.txt1";try {method(s);System.out.println("出现异常时我不会出现");} catch (IOException e) {e.printStackTrace();} finally {System.out.println("必须要执行我");}}public static void method(String s) throws IOException {if (!s.endsWith(".txt")) {throw new FileNotFoundException("文件不存在");} else {System.out.println("文件存在");}}
}输出结果:
java.io.FileNotFoundException: 文件不存在at com.epsda.advanced.test_exception.Test.method(Test.java:30)at com.epsda.advanced.test_exception.Test.main(Test.java:18)
必须要执行我// 如果加了System.exit(0)
public class Test {public static void main(String[] args) {String s = "test.txt1";try {method(s);System.out.println("出现异常时我不会出现");} catch (IOException e) {e.printStackTrace();System.exit(0); 使用 System.exit(0) 退出程序,此时finally也不会执行} finally {System.out.println("必须要执行我");}}public static void method(String s) throws IOException {if (!s.endsWith(".txt")) {throw new FileNotFoundException("文件不存在");} else {System.out.println("文件存在");}}
}输出结果:
java.io.FileNotFoundException: 文件不存在at com.epsda.advanced.test_exception.Test.method(Test.java:30)at com.epsda.advanced.test_exception.Test.main(Test.java:18)

一般使用finally在关闭资源时,因为部分情况下GC(垃圾回收器)无法回收堆内存中的文件,从而无法释放内存,此时需要在finally中手动关闭资源

抛出异常注意事项

  1. 如果父类方法已经抛出了异常,子类重写父类对应的方法就可以不再抛出异常
  2. 如果父类方法没有抛出异常,子类重写父类对应的方法就不要抛出异常

例如下面的代码:

// 父类方法不抛出异常,但子类对应的重写方法抛出异常
public class Test1 {public static void main(String[] args) {}class A {public void method() {}}class B extends A {@Overridepublic void method() throws Exception{}}
}输出结果:
overridden method does not throw java.lang.Exception

自定义异常类

如果想要自定义一个异常类,则自定义的类就必须继承自Exception,否则编译器不会将其当作异常类,格式如下:

public class 自定义异常类名 extends Exception {// 内容
}

例如下面的代码:

// 自定义异常类
public class LoginFailException extends Exception{
}// 测试
public class Test2 {public static void main(String[] args) {String name = "admin";String password = "123456";try {login(name, password);} catch (LoginFailException e) {e.printStackTrace();}}public static void login(String name, String password) throws LoginFailException{if(!name.equals("admin") || !password.equals("123456")){throw new LoginFailException();}}
}

如果想添加自定义异常信息,需要提供一个有参构造函数,该构造函数使用一个String类型的message构造对象,此时会调用父类的构造函数,因为Exception类中存在对应的构造函数

// 自定义异常类
public class LoginFailException extends Exception{public LoginFailException() {}public LoginFailException(String message) {super(message);}
}// 测试
public class Test2 {public static void main(String[] args) {String name = "admin";String password = "123456";try {login(name, password);} catch (LoginFailException e) {e.printStackTrace();}}public static void login(String name, String password) throws LoginFailException{if(!name.equals("admin") || !password.equals("123456")){throw new LoginFailException("登录失败");}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/419934.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

记一次高版本view-design的组件迁移到自身项目的低版本

背景 npm i -S view-design当前老项目使用view-design这个组件库&#xff0c;但是当我们去官网查看该组件库最新版本&#xff0c;竟然发现没有博主想用的image/ImagePreivew这两个基础组件 说实话&#xff0c;有点离谱了哈&#xff01;&#xff01; 自己造轮子&#xff1f; …

数据结构基本知识

一、什么是数据结构 1.1、组织存储数据 ---------》内存&#xff08;存储&#xff09; 1.2、研究目的 如何存储数据&#xff08;变量&#xff0c;数组....)程序数据结构算法 1.3、常见保存数据的方法 数组&#xff1a;保存自己的数据指针&#xff1a;是间接访问已经存在的…

分库分表核心理念

文章目录 分库&#xff0c;分表&#xff0c;分库分表什么时候分库&#xff1f;什么时候分表&#xff1f;什么时候既分库又分表&#xff1f;横向拆分 & 纵向拆分 分表算法Range 范围Hash 取模一致性 Hash斐波那契散列 严格雪崩标准&#xff08;SAC&#xff09;订单分库分表实…

【880高数】高等数学一刷错题整理

第一章 函数、极限、连续 2024.8.11日 1. 2. 3. 4. 5. 2024.8.12日 1. 2. 3. 4. 5. 6. 7. 8. 2024.8.13日 1. 2. 3. 4. 2024.8.14日 1. 2. 3. 4. 5. 第二章 一元函数微分学及其应用 2024.8.15日 1. 2. 3. 4. 5. 6. 2024.8.16日 1. 2. 3. 4. 5. 2024.8.17日 1. 2. 3. 4…

个人简历 (自己设计的)

欢迎大家来观看。 代码如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" co…

相亲交友系统背后的科技力量:智能匹配的秘密

随着互联网技术的发展&#xff0c;相亲交友系统已经成为许多人寻找另一半的重要工具。这些相亲交友系统不仅仅是一个简单的社交平台&#xff0c;它们背后隐藏着强大的科技力量&#xff0c;尤其是智能匹配技术&#xff0c;使得用户能够更加高效地找到适合自己的伴侣。 相亲交友…

信息学奥赛初赛天天练-87-NOIP2014普及组-完善程序-矩阵、子矩阵、最大子矩阵和、前缀和、打擂台求最大值

1 完善程序 最大子矩阵和 给出 m行 n列的整数矩阵&#xff0c;求最大的子矩阵和(子矩阵不能为空)。 输入第一行包含两个整数 m和 n&#xff0c;即矩阵的行数和列数。之后 m行&#xff0c;每行 n个整数&#xff0c;描述整个矩阵。程序最终输出最大的子矩阵和。 &#xff08;最…

C语言俄罗斯方块(VS2022版)

C语言俄罗斯方块 演示视频一、前置知识1.Win32 API 的使用2.宽字符的使用 二、封装核心数据与框架介绍三、核心操作介绍旋转操作检测操作水平检测竖直检测代码化简 四、源码展示在 tetris.h 中&#xff1a;在 tetris.c 中&#xff1a;在 test.c 中&#xff1a; 以下代码环境为 …

码上进阶_刷题模块测试_用例设计

码上进阶_刷题模块测试_用例设计 系统概述&#xff1a; 码上进阶是为程序员专门打造的交流平台&#xff0c;采用主流的微服务框架和C端技术栈作为技术基础。在这个平台上&#xff0c;程序员 可以通过刷题、练习和模拟面试来提升自己的面试能力。 功能测试&#xff1a; 登录…

SpringBoot OAuth2自定义登陆/授权页

背景 5 月份的时候&#xff0c;我实践并整理了一篇博客&#xff1a;SpringBoot搭建OAuth2&#xff0c;该博客完成之后&#xff0c;很长一段时间里我都有种意犹未尽的感觉。诚然&#xff0c;我把OAuth2搭起来了&#xff0c;各种场景的用例也跑通了&#xff0c;甚至源码也看了&am…

99.WEB渗透测试-信息收集-网络空间搜索引擎shodan(1)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;98.WEB渗透测试-信息收集-Google语法&#xff08;12&#xff09; 信息收集方向-网络空间…

【IDEA配置一个maven项目(详细操作流程)】

目录 一、安装Maven 1、官网下载maven链接地址&#xff1a;Maven – Download Apache Maven 2、下载完成后&#xff0c;解压到某一路径下。E:\JavaTools\apache-maven-3.9.8为例&#xff0c;实际配置环境变量时以自己安装的路径为准。 二、配置环境变量 1、右键此电脑–&g…

springboot、flowable 生成图片发布到Docker乱码问题

flowable自带的方法生成图片时&#xff0c;如设置字体为宋体&#xff0c;则本地测试没有问题&#xff0c;因为windows自带宋体字体库&#xff0c;但是如果发布到Docker&#xff0c;则会出现乱码问题&#xff0c;因为大部分Docker并不包含宋体字体库&#xff1b; 通过Java代码&a…

基于springboot+vue实现的在线商城系统

系统主要功能&#xff1a; &#xff08;1&#xff09;商品管理模块&#xff1a;实现了商品的基本信息录入、图片上传、状态管理等相关功能。 &#xff08;2&#xff09;商品分类模块&#xff1a;实现了分类的增删改查、分类层级管理、商品分类的关联等功能。 &#xff08;3&…

一个穷稳且病多的中年案例

调整 理性消费&#xff0c;量入为出 重视健康&#xff0c;提前规划 多元收入&#xff0c;提升自我 心态平和&#xff0c;知足常乐 提示&#xff1a;最后悔买“方”。 “方”和“車”对现金流的影响非常大。 全都是大额消耗性支出。 保持健康也需要物质基础。 为何收入或…

深度学习应用 - 自然语言处理(NLP)篇

序言 在信息技术的浩瀚星空中&#xff0c;深度学习犹如一颗璀璨的新星&#xff0c;正引领着人工智能领域的深刻变革。作为这一领域的核心分支&#xff0c;自然语言处理&#xff08; NLP \text{NLP} NLP&#xff09;更是借助深度学习的力量&#xff0c;实现了前所未有的飞跃。自…

BookStack在线文档管理系统本地Docker部署与远程访问详细教程

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

电池的电-热-寿命模型是什么?

一、背景 电池的电-热-寿命模型在工程领域具有重要意义&#xff0c;它是一种描述电池性能、温度与使用寿命之间相互关系的复杂模型。具体工程意义体现在以下几个方面&#xff1a; 性能预测&#xff1a; 通过电-热-寿命模型&#xff0c;工程师可以预测在不同负载条件下电池的…

基于YOLOv8的PCB缺陷检测算法,加入一种基于内容引导注意力(CGA)的混合融合方案(一)

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文内容&#xff1a;针对基于YOLOv8的PCB缺陷检测算法进行性能提升&#xff0c;加入各个创新点做验证性试验。 1&#xff09;提出了一种基于内容引导注意力(CGA)的混合融合方案&#xff0c;mAP0.5由原始的0.966提升至0.975 1.PCB缺陷…

【数据结构】排序算法篇二

【数据结构】排序算法篇二 1. 快速排序&#xff08;hoare版本&#xff09;&#xff08;1&#xff09;基本思想&#xff1a;&#xff08;2&#xff09;动态图解&#xff1a;&#xff08;3&#xff09;代码实现&#xff1a;&#xff08;4&#xff09;特性总结&#xff1a; 2. 快速…