Java中的异常概念
在Java编程中,异常(Exception)是一种特殊的情况,它在程序执行期间发生,会干扰程序正常的流程。
## 一、异常的产生原因
1. **用户输入错误**
- 例如,当一个程序期望用户输入一个整数,而用户输入了一个字符串时,就可能会产生异常。以下是一个简单的代码示例:
```java
import java.util.Scanner;
public class InputExceptionExample {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
try {
int num = Integer.parseInt(scanner.nextLine());
System.out.println("输入的整数为: " + num);
} catch (NumberFormatException e) {
System.out.println("输入错误,应该输入整数");
e.printStackTrace();
}
}
}
```
在这个例子中,如果用户输入的不是一个合法的整数,`Integer.parseInt`方法就会抛出`NumberFormatException`异常。
2. **资源不可用**
- 当程序试图访问一个不存在的文件或者网络连接失败时会产生异常。例如,当试图读取一个不存在的文件时:
```java
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class FileReadExceptionExample {
public static void main(String[] args) {
try {
File file = new File("nonexistent.txt");
Scanner scanner = new Scanner(file);
while (scanner.hasNextLine()) {
System.out.println(scanner.nextLine());
}
scanner.close();
} catch (FileNotFoundException e) {
System.out.println("文件不存在");
e.printStackTrace();
}
}
}
```
这里,当创建`Scanner`对象并尝试读取不存在的文件时,就会抛出`FileNotFoundException`异常。
3. **代码逻辑错误**
- 例如数组越界的情况。
```java
public class ArrayIndexOutOfBoundsExceptionExample {
public static void main(String[] args) {
int[] arr = {1, 2, 3};
try {
System.out.println(arr[3]);
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("数组越界");
e.printStackTrace();
}
}
}
```
在这个例子中,数组`arr`的有效索引范围是0 - 2,访问索引为3的元素就会抛出`ArrayIndexOutOfBoundsException`异常。
## 二、异常的分类
1. **检查型异常(Checked Exceptions)**
- 这些异常是在编译时检查的。例如`IOException`及其子类(如`FileNotFoundException`)。编译器会强制要求程序员处理这些异常,要么使用`try - catch`块捕获,要么在方法签名中使用`throws`关键字声明抛出。
- 这是为了让程序员在编写代码时就考虑到可能出现的异常情况,提高程序的健壮性。
2. **运行时异常(Runtime Exceptions)**
- 也称为非检查型异常(Unchecked Exceptions),例如`NullPointerException`、`ArrayIndexOutOfBoundsException`等。这些异常不需要在编译时进行处理,但是如果在运行时发生,可能会导致程序崩溃。
- 虽然不需要在编译时处理,但良好的编程习惯还是应该尽量避免这些异常的发生,例如在使用对象之前先进行`null`检查,确保数组索引在合法范围内等。
## 三、异常处理机制
1. **try - catch块**
- `try`块中包含可能会抛出异常的代码。如果在`try`块中发生了异常,程序会立即跳转到相应的`catch`块中进行处理。
- 一个`try`块可以有多个`catch`块,用来捕获不同类型的异常。例如:
```java
public class MultipleCatchExample {
public static void main(String[] args) {
try {
int num1 = 10;
int num2 = 0;
int result = num1/num2;
} catch (ArithmeticException e) {
System.out.println("除数不能为0");
} catch (Exception e) {
System.out.println("其他异常");
}
}
}
```
在这个例子中,首先会检查是否是`ArithmeticException`(因为除以0会抛出这个异常),如果不是这个异常,而`try`块中发生了其他异常,就会被`Exception`(所有异常的父类)类型的`catch`块捕获。
2. **finally块**
- `finally`块中的代码无论是否发生异常都会被执行。通常用于释放资源,如关闭文件、关闭数据库连接等。
```java
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class FinallyExample {
public static void main(String[] args) {
Scanner scanner = null;
try {
File file = new File("test.txt");
scanner = new Scanner(file);
while (scanner.hasNextLine()) {
System.out.println(scanner.nextLine());
}
} catch (FileNotFoundException e) {
System.out.println("文件不存在");
} finally {
if (scanner!= null) {
scanner.close();
}
}
}
}
```
在这个例子中,即使在`try`块中发生了`FileNotFoundException`异常,`finally`块中的代码也会执行,以确保`Scanner`对象被关闭。
3. **throws关键字**
- 用于在方法签名中声明该方法可能会抛出的异常。例如:
```java
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class ThrowsExample {
public static void readFile() throws FileNotFoundException {
File file = new File("test.txt");
Scanner scanner = new Scanner(file);
while (scanner.hasNextLine()) {
System.out.println(scanner.nextLine());
}
scanner.close();
}
public static void main(String[] args) {
try {
readFile();
} catch (FileNotFoundException e) {
System.out.println("文件不存在");
}
}
}
```
在`readFile`方法中,由于可能会发生`FileNotFoundException`,所以在方法签名中使用`throws`关键字声明抛出这个异常,然后在调用`readFile`方法的`main`方法中使用`try - catch`块来处理这个异常。
理解和正确处理Java中的异常对于编写稳定、可靠的Java程序至关重要。它可以帮助我们更好地应对程序运行过程中可能出现的各种意外情况,提高程序的容错能力。
相关文章:
Java中的异常概念
在Java编程中,异常(Exception)是一种特殊的情况,它在程序执行期间发生,会干扰程序正常的流程。 ## 一、异常的产生原因 1. **用户输入错误** - 例如,当一个程序期望用户输入一个整数,而用户…...
flutter_鸿蒙next_Dart基础②List
目录 代码示例 代码逐段解析 1. 创建和打印列表 2. 强类型列表 3. 创建可扩展的空列表 4. 创建填充列表 5. 列表扩展 6. 使用可选展开操作符 7. 获取列表长度 8. 列表反转 9. 添加多个元素 10. 移除元素 11. 根据索引移除元素 12. 在特定位置插入元素 13. 清空列…...
【2024保研经验帖】武汉大学测绘遥感国家重点实验室夏令营(计算机向)
前言 先说本人背景:末211,rk前5%,无科研,有几个竞赛(数模、机器人等) 武大的国重是我参加的第二个夏令营,武大国重这次有提前开几个分会场,一个在中南大学,一个在吉林大学,还有在兰…...
PyGWalker:让你的Pandas数据可视化更简单,快速创建数据可视化网站
1、PyGWalker应用: 在数据分析的过程中,数据的探索和可视化是至关重要的环节,如何高效地将分析结果展示给团队、客户,甚至是公众,是很多数据分析师和开发者面临的挑战,接下来介绍的两大工具组合——PyGWalker与Streamlit,可以帮助用户轻松解决这个问题,即使没有复杂的代…...
Ubuntu24.04远程开机
近来在几台机器上鼓捣linux桌面,顺便研究一下远程唤醒主机。 本篇介绍Ubuntu系统的远程唤醒,Windows系统的唤醒可搜索相关资料。 依赖 有远程唤醒功能的路由器(当前一般都带这个功能)有线连接主机(无线连接有兴趣朋友…...
网络编程(12)——完善粘包处理操作(id字段)
十二、day12 之前的粘包处理是基于消息头包含的消息体长度进行对应的切包操作,但并不完整。一般来说,消息头仅包含数据域的长度,但是如果要进行逻辑处理,就需要传递一个id字段表示要处理的消息id,当然可以不在包头传i…...
「3.3」虫洞 Wormholes
多组数据不清零——见祖宗 「3.3」虫洞 Wormholes 问题背景 「一本通3.3 练习2」 题目描述 John 在他的农场中闲逛时发现了许多虫洞。虫洞可以看作一条十分奇特的有向边,并可以使你返回到过去的一个时刻(相对你进入虫洞之前)。John 的每…...
网页篡改防御方法
网页篡改防御方法 将服务器安全补丁升级到最新版 操作系统、应用程序、数据库等都需要使用最新的安全补丁,打补丁主要是为防止攻击者利用缓冲溢出和设计缺陷等进行攻击。 封闭未使用但已经开放的网络服务端口及未使用的服务 对于Windows Server 2003操作系统&am…...
Pikachu-Cross-Site Scripting-xss盲打
xss盲打,不是一种漏洞类型,而是一个攻击场景;在前端、或者在当前页面是看不到攻击结果;而是在后端、在别的页面才看到结果。 登陆后台,查看结果;...
JAVA思维提升案例5
抢红包案例: 要求: 一个大V直播时发起了抢红包活动,分别有:9、666、188、520、99999五个红包。 请模拟粉丝来抽奖,按照先来先得,随机抽取,抽完即止,注意:一个红包只能被…...
PostgreSQL的字符集
PostgreSQL的字符集 PostgreSQL 支持多种字符集(character sets),也称为编码(encoding)。字符集决定了数据库存储和处理文本数据的方式。在创建数据库时,可以指定数据库的字符集,或者使用默认的…...
CUDA 参考文章
CUDA:NVCC编译过程和兼容性详解_nvcc把cuda代码转换成什么-CSDN博客https://blog.csdn.net/fb_help/article/details/80462853 1、CUDA:NVCC编译过程和兼容性详解 CUDA:NVCC编译过程和兼容性详解 https://codeyarns.com/2014/03/03/how-to-sp…...
强缓存和协商缓存的区别
强缓存和协商缓存是Web开发中用于优化页面加载性能的两种主要缓存机制,它们之间存在显著的区别。以下是对这两种缓存机制的详细比较: 一、定义与工作原理 强缓存 定义:强缓存是指在浏览器发送请求前,先检查本地缓存中是否存在可用…...
工控系统组成与安全需求分析
目录 工控系统安全威胁与需求分析工业控制系统安全需求分析 工控系统安全威胁与需求分析 工业控制系统是由各种控制组件监测组件数据处理与展示组件共同构成的,对工业生产过程进行控制和监控的业务流程管控系统。 就是现在有很多工厂,它比如说要生产鞋…...
C(十三)for、while、do - while循环的抉择 --- 打怪闯关情景
前言: 继C(十)for循环 --- 黑神话情景之后👉 https://blog.csdn.net/2401_87025655/article/details/142684637 今天,杰哥想用一个打怪闯关的场景让与大家一起初步认识一下for、while、do - while循环的抉择。…...
【Android 源码分析】Activity生命周期之onStop-2
忽然有一天,我想要做一件事:去代码中去验证那些曾经被“灌输”的理论。 – 服装…...
SpringCloudStream+RocketMQ多topic
之前写过两篇关于SpringCloudStream文章 spring-cloud-stream版本升级,告别旧注解EnableBinding,拥抱函数式编程_spring-cloud-stream output注解没有了-CSDN博客 SpringCloudStreamRocketMQ事务消息配置_spring-cloud-starter-stream-rocketmq-CSDN博…...
随记 前端框架React的初步认识
区分语言 像js 就是构建的最基本的 React框架和Vue框架,用自己的话来说的话,就是对js进行了一层封装,使使用js更加的方便 但是,React框架和Vue框架又不能这么简单的理解,因为这些框架里还封装了一些其他的东西。 向…...
数据结构 ——— 单链表oj题:链表分割(带哨兵位单向不循环链表实现)
目录 题目要求 手搓简易单链表 代码实现 题目要求 现有一链表的头指针 ListNode* head ,给一定值 x ,编写一段代码将所有小于 x 的节点排在其余节点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头节点 举例说明&a…...
华为 HCIP-Datacom H12-821 题库 (32)
🐣博客最下方微信公众号回复题库,领取题库和教学资源 🐤诚挚欢迎IT交流有兴趣的公众号回复交流群 🦘公众号会持续更新网络小知识😼 1.当一个运行 MSTP 协议的交换设备端口收到一个配置BPDU 时,会与设备保存的全局配…...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...
【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...
libfmt: 现代C++的格式化工具库介绍与酷炫功能
libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库,提供了高效、安全的文本格式化功能,是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全:…...
高效的后台管理系统——可进行二次开发
随着互联网技术的迅猛发展,企业的数字化管理变得愈加重要。后台管理系统作为数据存储与业务管理的核心,成为了现代企业不可或缺的一部分。今天我们要介绍的是一款名为 若依后台管理框架 的系统,它不仅支持跨平台应用,还能提供丰富…...
Qt Quick Controls模块功能及架构
Qt Quick Controls是Qt Quick的一个附加模块,提供了一套用于构建完整用户界面的UI控件。在Qt 6.0中,这个模块经历了重大重构和改进。 一、主要功能和特点 1. 架构重构 完全重写了底层架构,与Qt Quick更紧密集成 移除了对Qt Widgets的依赖&…...
RLHF vs RLVR:对齐学习中的两种强化方式详解
在语言模型对齐(alignment)中,强化学习(RL)是一种重要的策略。而其中两种典型形式——RLHF(Reinforcement Learning with Human Feedback) 与 RLVR(Reinforcement Learning with Ver…...
