《Java 简易速速上手小册》第4章:Java 中的异常处理(2024 最新版)

在这里插入图片描述

文章目录

  • 4.1 异常类型和错误 - 遇见你的小怪兽
    • 4.1.1 基础知识
    • 4.1.2 重点案例:文件读取处理
    • 4.1.3 拓展案例 1:处理空指针异常
    • 4.1.4 拓展案例 2:捕获多个异常
  • 4.2 异常处理机制 - 穿上你的超级英雄斗篷
    • 4.2.1 基础知识
    • 4.2.2 重点案例:用户登录验证
    • 4.2.3 拓展案例 1:处理多个异常
    • 4.2.4 拓展案例 2:使用 finally 清理资源
  • 4.3 自定义异常 - 创造你自己的小怪兽
    • 4.3.1 基础知识
    • 4.3.2 重点案例:用户年龄验证
    • 4.3.3 拓展案例 1:账户余额不足
    • 4.3.4 拓展案例 2:数据格式验证

4.1 异常类型和错误 - 遇见你的小怪兽

在 Java 世界的深处,有两种主要的问题可能会打乱你代码的步伐:异常(Exception)错误(Error)。这就像是你在编程道路上会遇到的两种小怪兽。让我们先来了解一下它们,然后学习如何勇敢地面对它们。

4.1.1 基础知识

  • 异常(Exception):异常是程序运行时发生的问题,它们可能会打断程序的正常流程。Java 把异常分为两大类:

    • 检查型异常(Checked Exceptions):这些异常必须被显式地捕获或者通过方法签名声明抛出。它们通常是外部错误,比如文件未找到或者类未找到等,我们可以预见并提前处理这些异常。
    • 非检查型异常(Unchecked Exceptions):包括运行时异常(RuntimeException)和错误(Error)。运行时异常是编程错误,如空指针异常或数组越界。这些异常通常是可以避免的。
  • 错误(Error):错误是指在正常程序控制范围之外的问题,通常是由 JVM 系统内部错误或资源耗尽错误(如 StackOverflowErrorOutOfMemoryError)引起的。当发生错误时,Java 运行时环境(JRE)通常无法继续运行。

4.1.2 重点案例:文件读取处理

假设你正在编写一个程序来读取用户指定的文件,并打印其内容。这是一个典型的情景,可能会遇到 FileNotFoundException,这是一个检查型异常。

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;public class FileReaderDemo {public static void main(String[] args) {try {File file = new File("example.txt");Scanner scanner = new Scanner(file);while (scanner.hasNextLine()) {String line = scanner.nextLine();System.out.println(line);}scanner.close();} catch (FileNotFoundException e) {System.out.println("An error occurred: File not found.");e.printStackTrace();}}
}

4.1.3 拓展案例 1:处理空指针异常

空指针异常(NullPointerException)是最常见的运行时异常之一,通常发生在试图调用或访问 null 对象的成员时。

public class NullPointerDemo {public static void main(String[] args) {try {String text = null;System.out.println(text.length());} catch (NullPointerException e) {System.out.println("Caught NullPointerException.");}}
}

4.1.4 拓展案例 2:捕获多个异常

在某些情况下,一个代码块可能会抛出多种类型的异常。Java 允许你在一个 catch 块中捕获多种类型的异常,这可以使代码更简洁。

import java.io.*;
import java.util.*;public class MultiCatchDemo {public static void main(String[] args) {try {File file = new File("example.txt");Scanner scanner = new Scanner(file);System.out.println(10 / 0); // 故意制造除以零的异常} catch (ArithmeticException | FileNotFoundException e) {System.out.println("An error occurred: " + e.getMessage());}}
}

通过这些案例,我们可以看到 Java 异常处理的力量,它不仅可以帮助我们优雅地处理潜在的问题,还能确保即使在遇到异常时,我们的程序也能保持稳定运行。记住,勇敢地面对这些小怪兽,使用 Java 提供的工具来保护你的代码不受它们的影响。

在这里插入图片描述


4.2 异常处理机制 - 穿上你的超级英雄斗篷

在 Java 的世界里,异常处理机制就像是给你的代码穿上了一件超级英雄斗篷。它不仅保护你的程序不受意外的干扰,还确保了程序的健壮性和可靠性。让我们深入了解这件斗篷的超能力吧!

4.2.1 基础知识

  • try-catchtry 块让你尝试执行一段可能会抛出异常的代码。如果异常发生,catch 块会捕获这个异常,让你有机会处理它。

  • finally:无论是否发生异常,finally 块中的代码都会执行。这是清理资源的理想场所,比如关闭文件流或数据库连接。

  • throw:你可以使用 throw 关键字抛出一个异常。这通常用于指示方法遇到了无法自己处理的情况。

  • throws:当你的方法可能会抛出一个检查型异常,但不打算在当前方法内处理它时,你可以在方法签名中使用 throws 关键字声明这个异常。

4.2.2 重点案例:用户登录验证

假设我们正在编写一个用户登录的功能,需要验证用户输入的用户名和密码。如果用户输入不正确,我们会抛出一个异常。

class AuthenticationException extends Exception {public AuthenticationException(String message) {super(message);}
}public class Login {public void authenticate(String username, String password) throws AuthenticationException {if (!"admin".equals(username) || !"password".equals(password)) {throw new AuthenticationException("Invalid username or password");}System.out.println("User authenticated successfully");}public static void main(String[] args) {Login login = new Login();try {login.authenticate("user", "1234");} catch (AuthenticationException e) {System.out.println(e.getMessage());}}
}

4.2.3 拓展案例 1:处理多个异常

在实际应用中,你可能需要处理多种类型的异常。Java 允许你在一个 try 块中捕获多个异常,并分别处理它们。

public class MultiExceptionHandling {public static void main(String[] args) {try {int[] numbers = new int[1];numbers[10] = 10; // 这会抛出 ArrayIndexOutOfBoundsExceptionSystem.out.println(10 / 0); // 这会抛出 ArithmeticException} catch (ArrayIndexOutOfBoundsException e) {System.out.println("Array index is out of bounds!");} catch (ArithmeticException e) {System.out.println("Cannot divide by zero!");}}
}

4.2.4 拓展案例 2:使用 finally 清理资源

在处理文件或数据库连接时,确保资源最终被关闭是非常重要的。即使发生异常,finally 块也可以保证这一点。

import java.io.*;public class FileReading {public static void main(String[] args) {BufferedReader reader = null;try {reader = new BufferedReader(new FileReader("example.txt"));String line = reader.readLine();while (line != null) {System.out.println(line);line = reader.readLine();}} catch (IOException e) {System.out.println("Error reading file.");} finally {try {if (reader != null) {reader.close();}} catch (IOException e) {System.out.println("Error closing the file.");}}}
}

通过这些案例,我们可以看到 Java 异常处理机制的强大之处。它不仅帮助你优雅地处理程序中的意外情况,还确保了资源的正确管理和释放。记住,掌握这些技巧,你的代码就穿上了超级英雄的斗篷,无惧任何挑战!

在这里插入图片描述


4.3 自定义异常 - 创造你自己的小怪兽

在 Java 的异常处理机制中,有时预定义的异常无法完全满足我们的需求。这时,Java 给了我们一个超能力——创造自己的异常。这就像是在你的代码世界中创造一个全新的小怪兽,完全按照你的规则行动。

4.3.1 基础知识

要创建一个自定义异常,你只需要定义一个类继承自 Exception 类(对于检查型异常)或 RuntimeException 类(对于非检查型异常)。这个新类就是你的自定义异常,你可以添加任何你需要的属性或方法。

// 检查型异常示例
public class MyCheckedException extends Exception {public MyCheckedException(String message) {super(message);}
}// 非检查型异常示例
public class MyUncheckedException extends RuntimeException {public MyUncheckedException(String message) {super(message);}
}

4.3.2 重点案例:用户年龄验证

假设我们正在编写一个应用程序,需要验证用户的年龄是否满足特定条件。如果年龄不符合要求,我们将抛出一个自定义异常。

class InvalidAgeException extends Exception {public InvalidAgeException(String message) {super(message);}
}public class AgeValidator {public void validateAge(int age) throws InvalidAgeException {if (age < 18) {throw new InvalidAgeException("Age less than 18 is not allowed");} else {System.out.println("Age is valid");}}public static void main(String[] args) {AgeValidator validator = new AgeValidator();try {validator.validateAge(16);} catch (InvalidAgeException e) {System.out.println(e.getMessage());}}
}

4.3.3 拓展案例 1:账户余额不足

在一个银行应用程序中,当用户尝试提取超过其账户余额的金额时,我们可以抛出一个自定义异常来处理这种情况。

class InsufficientFundsException extends Exception {public InsufficientFundsException(String message) {super(message);}
}public class BankAccount {private double balance;public BankAccount(double balance) {this.balance = balance;}public void withdraw(double amount) throws InsufficientFundsException {if (balance < amount) {throw new InsufficientFundsException("Insufficient funds for withdrawal");} else {balance -= amount;System.out.println("Withdrawal successful");}}public static void main(String[] args) {BankAccount account = new BankAccount(100);try {account.withdraw(150);} catch (InsufficientFundsException e) {System.out.println(e.getMessage());}}
}

4.3.4 拓展案例 2:数据格式验证

在处理用户输入或文件读取时,我们可能需要验证数据的格式。如果数据格式不正确,抛出一个自定义异常是一个很好的做法。

class InvalidFormatException extends Exception {public InvalidFormatException(String message) {super(message);}
}public class DataProcessor {public void processData(String data) throws InvalidFormatException {if (!data.matches("\\d+")) { // 简单的数字格式验证throw new InvalidFormatException("Data format is invalid");} else {System.out.println("Processing data: " + data);}}public static void main(String[] args) {DataProcessor processor = new DataProcessor();try {processor.processData("abc123");} catch (InvalidFormatException e) {System.out.println(e.getMessage());}}
}

通过这些案例,我们看到了自定义异常如何提高程序的可读性和健壮性。它们让异常处理变得更加具体和直观,帮助其他开发者(或未来的你)快速理解代码中可能发生的问题。创造你自己的小怪兽,让它们在需要时为你服务!

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

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

相关文章

【开源】SpringBoot框架开发食品生产管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 加工厂管理模块2.2 客户管理模块2.3 食品管理模块2.4 生产销售订单管理模块2.5 系统管理模块2.6 其他管理模块 三、系统展示四、核心代码4.1 查询食品4.2 查询加工厂4.3 新增生产订单4.4 新增销售订单4.5 查询客户 五、…

ES分页问题

分页方式3种 from size 浅分页 其中&#xff0c;from定义了目标数据的偏移值&#xff0c;size定义当前返回的数目。默认from为0&#xff0c;size为10&#xff0c;即所有的查询默认仅仅返回前10条数据。越往后查询效率越低; 5w条以内勉强可用; 如果搜索size大于10000&#xff…

突破编程_C++_面试(基础知识(13))

面试题45&#xff1a;C中的字符串如何存储 在C中&#xff0c;字符串可以通过多种方式存储&#xff0c;但最常见和推荐使用的方式是通过 std::string 类&#xff0c;该类位于 <string> 头文件中。std::string 是一个类模板的实例&#xff0c;通常用于存储字符数组&#x…

[FFmpeg学习]从视频中获取图片

从视频中获取图片是一个比较直观的例子&#xff0c;这里从一个基础的例子来查看FFmpeg相关api的使用&#xff0c;从mp4文件中获取一帧图像&#xff0c;保存为jpeg格式图片&#xff0c;mp4文件比较好准备&#xff0c;一般手机录屏文件就是mp4格式。 原理还是比较清楚&#xff0…

2.13学习总结

1.出差&#xff08;Bleeman—ford&#xff09;&#xff08;spfa&#xff09; &#xff08;dijkstra&#xff09; 2.最小生成树&#xff08;prim&#xff09;&#xff08;Kruskal&#xff09; 最短路问题&#xff1a; 出差https://www.luogu.com.cn/problem/P8802 题目描述 AA …

sklearn:机器学习 分类特征编码category_encoders

文章目录 category_encoders简介OrdinalEncoder 序列编码OneHotEncoder 独热编码TargetEncoder 目标编码Binary Encoder 二进制编码BaseNEncoder 贝叶斯编码LeaveOneOutEncoder 留一法HashingEncoder 哈希编码CatBoostEncoder catboost目标编码CountEncoder 频率编码WOEEncoder…

《Docker极简教程》--Docker镜像--Docker镜像的管理

一、镜像标签与版本管理 1.1 标签的作用与命名规范 标签在Docker镜像中具有标识和版本控制的作用&#xff0c;可以帮助用户识别和管理不同版本的镜像。以下是一些关于Docker镜像标签的常见作用和命名规范&#xff1a; 标识不同版本: 标签通常用于区分不同版本的镜像。例如&a…

Netty应用(九) 之 编解码器概念 Netty常见的编解码器

目录 22.编解码器 22.1 编解码的概念 22.2 netty中的编解码 22.3 序列化 23.编解码器在使用过程中的两部分核心内容 23.1 序列化协议&#xff08;编码格式&#xff09;&#xff08;传输数据的格式&#xff09; 23.1.1 Java默认的序列化与反序列化 23.1.2 XML的序列化与反…

【UI自动化测试技术】自动化测试研究:Python+Selenium+Pytest+Allure,详解UI自动化测试,了解元素交互的常用方法(精)(三)

导言 在之前的文章里&#xff0c;我们一起学习了定位方式、等待机制等内容。相信通过之前的学习&#xff0c;你已经掌握了WEB自动化的一些入门知识&#xff0c;具备了编写代码的一些基础知识和能力。这篇文章&#xff0c;让我们一起学习一下模拟键盘事件。 在实际的项目当中&a…

Ps:焦点堆栈

焦点堆栈 Focus Stacking是一种摄影和图像处理技术&#xff0c;通过合并多张在不同焦距拍摄的照片来创建一张具有更大景深的图像&#xff0c;特别适用于微距摄影、风景摄影和任何需要在整个场景中保持尖锐对焦的情况。 ◆ ◆ ◆ 拍摄注意事项 1、使用三脚架 为了确保图像之间…

嵌入式大厂面试题(2)—— 富士康

从本篇开始将会更新历年来各个公司的面试题与面经&#xff0c;题目来自于网上各个平台以及博主自己遇到的&#xff0c;如果大家有所帮助&#xff0c;帮忙点点赞和关注吧&#xff01; 岗位&#xff1a;嵌入式软件工程师。 面试时间&#xff1a;30分钟。 岗位职责&#xff1a;官网…

django的基本使用-ORM(二)

一、简介 ORM对象关系映射&#xff0c;它允许你使用类和对象对数据库进行操作&#xff0c;从而避免通过SQL语句操作数据库 模型层: 负责和数据库之间进行通信 模型是一个Python类&#xff0c;它是由django.db.models.Model派生出的子类 一个模型类代表数据库中的一张表 模型类…

【Tauri】(3):使用Tauri1.5版本,进行桌面应用开发,在windows上搭建环境,安装node,rust环境,可以打包成功,使用vite创建应用

1&#xff0c;视频地址&#xff1a; https://www.bilibili.com/video/BV1Ny421a7nA/ 【Tauri】&#xff08;3&#xff09;&#xff1a;使用Tauri1.5版本&#xff0c;进行桌面应用开发&#xff0c;在windows上搭建环境&#xff0c;安装node&#xff0c;rust环境&#xff0c;可以…

gstreamer 常用的图片格式转换命令

文章目录 前言一、怎样使用 gstreamer 生成 pattern 数据1. 将 videotestsrc 生成的 pattern 数据送显2. 将 videotestsrc 生成的 pattern 数据保存为图片(文件)二、gstreamer 如何对图片进行格式转换三、gstreamer 如何对图片进行缩放四、gstreamer 如何对图片进行裁剪总结前言…

安全SaaS服务转型的优与劣

文章目录 前言一、ToB的SaaS服务的神话(一)指数级的增长率(二)极低的销售成本二、SaaS 化的真实价值(一)云端数据驱动的AI安全能力建设(二)云端服务规模化带来的价格/效能优势(三)随时随地的统一安全接入与访问总结前言 SaaS化转型似乎是安全行业近十年来最重要的趋…

CorelDRAW2024国内专业个人免费版下载

CorelDRAW是一款屡获殊荣的图形和图像编辑软件&#xff0c;包含两个绘图应用程序&#xff1a;一个用于矢量图及页面设计&#xff0c;另一个用于图像编辑。自1989年进入中国市场以来&#xff0c;CorelDRAW不断推出新的版本和功能&#xff0c;以满足用户不断变化的需求。 CorelD…

【C++计算几何】点是否在线段上

题目描述 输入一个点Q和一条线段P1P2的坐标&#xff0c;判断这个点是否在该线段上。 输入 一行&#xff0c;共六个浮点数&#xff0c;依次表示Q&#xff0c;P1和P2的坐标。 输出 一行&#xff0c;一个字符数&#xff0c;“YES”或“NO”分别表示改点在或者不在线段上。 样…

python从入门到精通(十九):python的多线程详细使用

python的多线程详细使用 1.什么是线程2.线程的作用3.导入线程4.创建线程启动线程线程阻塞线程的方法 守护线程线程阻塞2个都是守护线程1个是守护线程 线程间通信 1.什么是线程 线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中&#xff0c;是进程中的实际运作单…

数字图像处理实验记录十(图像分割实验)

一、基础知识 1、什么是图像分割 图像分割就是指把图像分成各具特性的区域并提取出感兴趣目标的技术和过程&#xff0c;特性可以是灰度、颜色、纹理等&#xff0c;目标可以对应单个区域&#xff0c;也可以对应多个区域。 2、图像分割是怎么实现的 图像分割算法基于像素值的不连…

「Java」static 关键字

介绍 概述&#xff1a;static 是一个静态关键字使用 修饰一个成员变量&#xff1a;static 数据类型 变量名 修饰一个方法 修饰符 static 返回值类型 方法名(形参){方法体 return 结果 }调用静态成员&#xff1a;类名直接调用&#xff08;不用 new 对象&#xff09; static…