Java基础(8)异常

目录

1.前言

2.正文

2.1异常的引入

2.2异常的类型

2.2.1编译时异常

2.2.2运行时异常

2.3区分Exception与Error

2.4异常的声明,抛出与捕获

2.4.1throw

2.4.2throws

2.4.2try-catch与finally

2.6自定义异常

3.小结


1.前言

哈喽大家好啊,Java基础马上就要到尾声了,讲完异常这个章节之后再讲一个String类,Java基础基本就结束了,那么让我们废话不多说开始下面的学习。

2.正文

2.1异常的引入

异常是什么,虽然这个概念听起来很陌生,但在我们平时编写程序的时候肯定会出现异常啦,下面就是据一些例子:

public class test {public static void main(String[] args) {System.out.println(10 / 0);}
}

 接下来就让我们来解释一下这个异常:

它表示在算术运算过程中出现了异常情况。这个异常通常在执行算术运算时抛出。

public class test {public static void main(String[] args) {int[] array = new int[] {1,2,3,4,5};System.out.println(array[10]);}
}

这个也是一个常见的异常,大概意思如下:

它表明程序试图访问数组中不存在的索引。换句话说,当你尝试访问数组的某个元素时,如果使用的索引超出了数组的有效索引范围(即小于0或大于等于数组长度),就会抛出这个异常。 

我们见识了这些常见的异常,那么异常到底是什么呢,接下来就是异常的概念:

异常(Exception)是指程序执行过程中可能出现的不正常情况或错误。它是一个事件,会中断正在执行的程序,并可能导致程序出现错误或崩溃。

2.2异常的类型

2.2.1编译时异常

编译性异常(也称为编译时异常或检查型异常)是在编译阶段就能被检测到的异常,它们必须被显式地捕获或声明在方法签名中,至于如何写在方法签名中下文的throws会讲解。另外要注意以下几点:

  • 编译时异常必须在编译时处理,要么通过try-catch语句捕获处理,要么通过方法签名使用throws关键字声明抛出。如果既没有捕获也没有声明抛出,编译器会报错。
  • 受检异常通常表示可恢复的错误,也就是说,程序在遇到这类异常时,可以选择恰当的恢复策略,比如重新尝试操作、提供替代方案等。

2.2.2运行时异常

运行时异常表示在程序运行时可能发生的错误。这些异常通常是程序逻辑错误导致的,编译器不会强制要求开发者捕获这些异常。运行时异常的主要特点如下:

  • 运行时异常在编译时不需要处理,编译器不会强制要求捕获或声明抛出。这意味着,即使代码中存在可能抛出运行时异常的情况,编译器也不会报错。

  • 运行时异常通常表示不可恢复的错误,一旦发生,程序往往无法继续正常执行。因此,运行时异常通常不需要捕获处理,而是通过代码审查和测试来避免。

2.3区分Exception与Error

在区分这个之前,我们需要先讲解一下异常的本质:

异常在Java中的本质是类。Java的异常处理机制是建立在类和对象的基础上的。所有的异常都是从java.lang.Throwable类派生出来的子类。Throwable类有两个重要的子类:ExceptionError

在明白这个之后我们就可以来区分Exception与Error了,Exception表示程序运行时可预料的异常,可以被捕获(即通过try-catch处理)并处理,使程序有机会恢复;而Error表示JVM或系统层面的严重错误,通常不可预料且无法恢复,不建议捕获处理。

2.4异常的声明,抛出与捕获

在我们明白异常的概念之后,那我们在实际的编程中要如何处理这些异常,如何尽可能规避这些异常呢,接下来我们就需要来讲解几个关键字以及具体应用

2.4.1throw

throw的语法规则如下:

throw new Exception("自定义异常信息");

有以下几个需要注意的点:

  • 抛出的异常必须是Throwable类的子类。
  • throw关键字只能在方法内部使用,不能在方法外部或静态代码块中直接抛出异常。

下面是具体的示例: 

public class test {// 一个方法,用于检查输入的数字是否为正数public void checkPositiveNumber(int number) {// 使用throw关键字抛出一个IllegalArgumentExceptionif (number <= 0) {throw new IllegalArgumentException("数字必须是正数");}System.out.println("数字是正数: " + number);}public static void main(String[] args) {test example = new test();example.checkPositiveNumber(10);example.checkPositiveNumber(-1);}
}

主函数中分别输入了10和-1,运行结果如下:

2.4.2throws

throws关键字是用于声明下段代码可能会出现异常,并标示出来,实际上并没有起到解决异常根本的作用,为了使程序能够进行下去,接下来是具体的使用规则:

public void someMethod() throws ExceptionA, ExceptionB {// 方法体
}

使用时有以下注意的点:

  • 只能声明检查型异常throws只能用于声明检查型异常(其中的大类是编译型异常),不能用于非检查型异常。
  • 可以声明多个异常:一个方法可以声明它可能会抛出多个异常类型。
  • 方法内部不处理的异常:如果一个方法可能会抛出某些异常,但选择不处理它们,那么必须在方法签名中使用throws声明这些异常。
  • 构造函数和静态初始化块throws不能用于构造函数和静态初始化块。

下面就对上文出现的代码中的异常进行了声明: 

public class test {// 一个方法,用于检查输入的数字是否为正数public void checkPositiveNumber(int number) throw IllegalArgumentException{if (number <= 0) {throw new IllegalArgumentException("数字必须是正数");}System.out.println("数字是正数: " + number);}public static void main(String[] args) {test example = new test();example.checkPositiveNumber(10);example.checkPositiveNumber(-1);}
}

2.4.2try-catch与finally

try-catch是Java中用于异常处理的一组关键字,它们允许程序在发生异常时捕获并处理这些异常,而不是让程序崩溃,具体语法规则如下:

try {// 可能抛出异常的代码
} catch (ExceptionType name) {// 异常处理代码
}

一般在代码进行完后,我们需要对代码运行做一些收尾工作,比如将之前Scanner关闭等,语法规则如下:

try {// 可能抛出异常的代码
} catch (ExceptionType name) {// 异常处理代码
} finally {// 总是执行的代码,常用于清理工作
}

我们拿以下代码做示例:

import java.util.Scanner;public class test {public int add(int a, int b) throws IllegalArgumentException {if (a < 0 || b < 0) {throw new IllegalArgumentException("数字不能为负数");}return a + b;}public static void main(String[] args) {Scanner scanner = new Scanner(System.in);test calculator = new test();try {System.out.print("请输入第一个加数:");int num1 = scanner.nextInt();System.out.print("请输入第二个加数:");int num2 = scanner.nextInt();int result = calculator.add(num1, num2);System.out.println("两数之和为:" + result);} catch (IllegalArgumentException e) {// 捕获并处理IllegalArgumentExceptionSystem.out.println("错误:" + e.getMessage());} finally {// 关闭scanner资源scanner.close();System.out.println("finally已运行.....");}}
}

这一段代码实现的功能很基础,但运用了我们上文所讲的所有的关键字,接下来详细分析一下该代码的俩种执行结果:

如果俩数皆为正数:

  • 则在运行完try模块后直接运行finally板块。

 


如果俩数中有负数:

  • 在跳转到add方法时抛出IllegalArgumentException异常
  • catch对该异常进行捕捉并打印错误信息(对异常进行实例化然后调用getMessage自带的方法)
  • 再运行finally。

2.6自定义异常

Java中已经为我们提供了许多异常,但我们在实际工程中也可以自己创建一个更加切合应用场景的自定义异常,来更好的为项目服务,提供更加详尽的异常信息。接下来我们以一个登陆系统背景为例来讲清楚,示例如下:

class passWordException extends Exception {public passWordException() {super();}public passWordException(String s) {super(s);}
}class Login {private static String correctPassword = "123456";private String password;public Login(String password) {this.password = password;}public boolean checkPassword() throws passWordException {if (!this.password.equals(correctPassword)) {throw new passWordException("密码错误!");}return true;}
}public class test {public static void main(String[] args) {try {Login login1 = new Login("123456");System.out.println("尝试登录1: " + login1.checkPassword());Login login2 = new Login("654321");System.out.println("尝试登录2: " + login2.checkPassword());} catch (passWordException e) {System.out.println("捕获到异常: " + e.getMessage());e.printStackTrace();}}
}

上段代码展示了如何自定义一个异常类,在继承Exception类后在自定义异常类中写自己的方法, 最后进行调试。

运行结果如下:

第一次登陆时没有异常,第二次登陆后触发该异常,捕捉到异常后打印异常信息(红字中均是打印出的错误信息)

3.小结

今天的分享到这里就结束了,喜欢的小伙伴点点赞点点关注,你的支持就是对我最大的鼓励,加油!

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

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

相关文章

解决rabbitmq-plugins enable rabbitmq_delayed_message_exchange :plugins_not_found

问题&#xff1a;我是在docker-compose环境部署的 services:rabbitmq:image: rabbitmq:4.0-managementrestart: alwayscontainer_name: rabbitmqports:- 5672:5672- 15672:15672environment:RABBITMQ_DEFAULT_USER: rabbitRABBITMQ_DEFAULT_PASS: 123456volumes:- ./rabbitmq/…

JavaScript语法基础——变量,数据类型,运算符和程序控制语句(小白友好篇,手把手教你学会!)

一、JavaScript概述 JavaScript是一种高级编程语言&#xff0c;常用于网页开发和服务器端应用程序。它是一种动态类型语言&#xff0c;可以在浏览器中直接解释执行&#xff0c;而不需要编译。 脚本&#xff08;Script&#xff09;是一种与计算机程序相关的指令集或代码块&…

Android 中View.post的用法

View.post 是 Android 中 View 类的一个方法&#xff0c;它允许我们在视图 (View) 完成其布局 (Layout) 阶段后&#xff0c;将一个任务放到主线程的消息队列中&#xff0c;以便稍后执行。这种方式通常用于确保在 View 的尺寸、位置等布局属性已经计算完成后执行某些操作。 基本…

健康之路押注医药零售:毛利率下滑亏损扩大,医疗咨询人次大幅减少

《港湾商业观察》黄懿 2024年9月13日&#xff0c;健康之路股份有限公司&#xff08;下称“健康之路”&#xff09;再次递表港交所&#xff0c;建银国际为独家保荐人。健康之路国内运营主体为健康之路&#xff08;中国&#xff09;信息技术有限公司和福建健康之路信息技术有限公…

在pycharm中使用sqllite

在pycharm中使用sqllite sqllite 简介 SQLite 是一个开源的、轻量级的、关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;它设计用于嵌入到应用程序中&#xff0c;并且可以在无需外部服务器进程的情况下运行。SQLite 提供了完整的 SQL 语言支持&#xff0c;允…

游戏启动失败:8种修复xinput1_3.dll错误的几种方法教程,轻松解决xinput1_3.dll错误

当你准备好在一天的工作后放松一下&#xff0c;启动你最爱的游戏&#xff0c;却突然收到一个“xinput1_3.dll 丢失”的错误消息&#xff0c;这无疑是令人沮丧的。幸运的是&#xff0c;xinput1_3.dll丢失问题通常可以通过几个简单的步骤来解决。本文将详细介绍这些步骤&#xff…

多线程和线程同步基础篇学习笔记(Linux)

大丙老师教学视频&#xff1a;10-线程死锁_哔哩哔哩_bilibili 目录 大丙老师教学视频&#xff1a;10-线程死锁_哔哩哔哩_bilibili 线程概念 为什么要有线程 线程和进程的区别 在处理多任务的时候为什么线程数量不是越多越好? Linux提供的线程API 主要接口 线程创建 pth…

DDRPHY数字IC后端设计实现系列专题

在对 LPDDR3 物理层接口模块进行后端设计之前&#xff0c;需要对该模块的功能结 构以及后端物理设计流程的相关理论进行深入的分析和研究。本章第一节详细分 析了本次 LPDDR3 物理层接口模块的结构&#xff0c;为该模块的布图布局的合理规划奠 定了理论基础&#xff0c;并且分析…

【笔记】数据结构与算法

参考链接&#xff1a;数据结构(全) 参考链接&#xff1a;数据结构与算法学习笔记 一些PPT的整理&#xff0c;思路很不错&#xff0c;主要是理解角度吧&#xff0c;自己干啃书的时候结合一下会比较不错 0.总论 1.数据 注&#xff1a;图是一种数据结构&#xff01;&#xff01;…

无人机救援系统基本组成

无人机救援系统基本组成 1. 源由2. 组成2.1 无人机载具2.1.1 多旋翼2.1.2 垂起固定翼2.1.3 智能避障2.1.4 物资投递 2.2 智能吊舱2.2.1 云台2.2.2 高清摄像2.2.3 红外热成像2.2.4 激光测距2.2.5 目标跟踪 2.3 通讯链路2.3.1 超长距离通信2.3.2 长距离通信2.3.3 中等距离通信 2.…

拍拍贷鸿蒙版H5容器之路

背景介绍 业务背景 2024年1月18日华为宣布&#xff1a;HarmonyOS NEXT 将不再支持 Android系统&#xff0c;基于以上背景及国内信贷业务现状&#xff0c;公司决定启动借款App鸿蒙化项目。 下图是2024年6月华为HDC大会上&#xff0c;华为宣布 HarmonyOS NEXT 将面向开发者和先…

微信小程序服务通知

项目中用到了小程序的服务消息通知&#xff0c;通知订单状态信息&#xff0c;下边就是整理的一下代码&#xff0c;放到项目中&#xff0c;把项目的小程序appid和小程序的secret写进去&#xff0c;直接运行即可 提前申请好小程序服务信息通知短信模板&#xff0c;代码需要用到模…

3000字帮你彻底搞懂Java抽象类与接口的区别(含JDK8接口新增三种方法与丰富案例)

Java-OOP 1-Final 1.1简介 final关键字是最终的意思&#xff0c;可以修饰&#xff1a;类、方法、变量。 修饰类&#xff1a;该类被成为最终类&#xff0c;特点是不能被继承了。修饰方法&#xff1a;该方法被称为最终方法&#xff0c;特点是不能被重写了。修饰变量&#xff…

有没有噪音低的宠物空气净化器推荐?希喂、IAM性能PK

有一说一&#xff0c;随着清洁家电市场的不断发展&#xff0c;市面上的各种清洁家电品类也是越来越多&#xff0c;像是吸尘器、洗地机、扫地机等等这些产品估计大家都很熟悉了。 但&#xff01;如果你家也跟我家一样也是养了几只猫猫狗狗&#xff0c;那你就会发现到&#xff0…

vscode摸鱼学习插件开发

不知道大家在摸鱼的时候&#xff0c;会不会想要学习&#xff1f; 或者有没有考公人&#xff0c;下班要学习的&#xff1f; 上班时间摸鱼&#xff0c;下班时间不够学习&#xff1f; 为此&#xff0c;我决定开发一个vscode插件&#xff0c;来刷粉笔题 粉笔插件名称&#xff1a;…

hive将包含逗号的字段拆分为多列

目录 一、概述 二、行动 1.准备数据 2.数据清洗 3.substring_index函数 4.split函数实现 一、概述 想将hive表中包含逗号的字段按逗号做分隔符进行分列操作 二、行动 1.准备数据 --1 select {1,2,3,4,5,6,7,8} as num_str --使用的数据2.数据清洗 --2 select num_s…

文心一言 VS 讯飞星火 VS chatgpt (381)-- 算法导论24.5 1题

一、给出图24-2的与图中两棵最短路径树不同的另外两棵最短路径树。如果要写代码&#xff0c;请用go语言。 文心一言&#xff1a; 在图论中&#xff0c;最短路径树&#xff08;Shortest Path Tree, SPT&#xff09;是一种从单个源点到所有其他节点的最短路径形成的树。给定一个…

故障诊断 | MTF-TLSSA-DarkNet-GRU-MSA迁移学习故障识别程序(t分布+莱维飞行改进麻雀优化)

故障诊断 | 故障诊断实例代码 目录 故障诊断 | 故障诊断实例代码效果一览基本介绍程序设计参考资料 效果一览 基本介绍 利用了迁移学习和多项技术改进&#xff0c;包括麻雀搜索法、DarkNet19、GRU、多头注意力机制等&#xff0c;以提高故障识别的准确性和效率 模型框架&#x…

在Bash脚本中 set -e 是什么意思

问题 我正在研究这个预安装(preinst)脚本的内容&#xff0c;该脚本会在从 Debian 软件包(.deb)文件解压该包之前执行。 脚本包含以下代码&#xff1a; #!/bin/bash set -e # Automatically added by dh_installinit if [ "$1" install ]; thenif [ -d /usr/share…

使用yolov3配置文件训练自己的数据

目录 前言 一、准备数据集 二、创建文件结构 三、格式化文件 1.data文件夹 2.config文件夹 四、修改yolo的配置文件 1.train文件 2.json2yolo文件 3.datasets文件 前言 使用yolov3框架训练自己的数据大致分为这四步&#xff1a; 准备数据集创建文件结构格式化文件 …