《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 查询客户 五、…

[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 …

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的序列化与反…

Ps:焦点堆栈

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

【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;可以…

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

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

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

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

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

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

ubuntu下如何查看显卡及显卡驱动

ubuntu下如何查看显卡及显卡驱动 使用nvidia-smi 工具查看 查看显卡型号nvida-smi -L $ nvidia-smi -L GPU 0: NVIDIA GeForce RTX 3050 4GB Laptop GPU (UUID: GPU-4cf7b7cb-f103-bf56-2d59-304f8996e28c)当然直接使用nvida-smi 命令可以查看更多信息 $ nvidia-smi Mon Fe…

C# CAD2016获取数据操作BlockTableRecord、Polyline、DBObject

一、数据操作说明 //DBObject 基础类 DBObject dbObj (DBObject)tr.GetObject(outerId, OpenMode.ForRead); //Polyline 线段类 Polyline outerPolyline (Polyline)tr.GetObject(outerId, OpenMode.ForRead); //BlockTableRecord 块表类 BlockTableRecord modelSpace (Bloc…

vue_dev_tools工具下载安装打包

vue_dev_tools工具下载安装打包 一、简介二、安装方式2.1.安装图文2.2.打包工具 endl 一、简介 使用 Vue 时&#xff0c;在浏览器上安装 Vue Devtools Vue Devtools 是 Vue 官方发布的调试浏览器插件&#xff0c;可以安装在 Chrome 和 Firefox 等浏览器上&#xff0c;直接内嵌…

LeetCode Python - 12. 整数转罗马数字

目录 题目答案运行结果 题目 罗马数字包含以下七种字符&#xff1a; I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如&#xff0c; 罗马数字 2 写做 II &#xff0c;即为两个并列的 1。1…

去空行小工具Html + Javascript

这是一个平常用到的小工具&#xff0c;为了节省屏幕空间把空行去掉&#xff0c;怕要用的时候找不到故记录在此。 效果图 网页版&#xff0c;放在浏览器里就可以用 <!doctype html> <html><head><meta charset"utf-8"><title>去回车…

网络安全的今年:量子、生成人工智能以及 LLM 和密码

尽管世界总是难以预测&#xff0c;但网络安全的几个强劲趋势表明未来几个月的发展充满希望和令人担忧。有一点是肯定的&#xff1a;2024 年将是非常重要且有趣的一年。 近年来&#xff0c;人工智能&#xff08;AI&#xff09;以令人难以置信的速度发展&#xff0c;其在网络安全…

如何在Spring Boot中启用HTTPS?

在Spring Boot中启用HTTPS是一个增强应用程序安全性的重要步骤。下面我将介绍如何将一个Spring Boot项目配置成支持HTTPS协议。 引入 在现代的网络通信中&#xff0c;安全性成为了一个不能忽视的要求。特别是当我们谈论到数据传输时&#xff0c;保护用户信息的安全性是非常重要…

中科大计网学习记录笔记(八):FTP | EMail

前言&#xff1a; 学习视频&#xff1a;中科大郑烇、杨坚全套《计算机网络&#xff08;自顶向下方法 第7版&#xff0c;James F.Kurose&#xff0c;Keith W.Ross&#xff09;》课程 该视频是B站非常著名的计网学习视频&#xff0c;但相信很多朋友和我一样在听完前面的部分发现信…

基于STM32与FreeRTOS的四轴机械臂项目

目录 一、项目介绍 二、前期准备 1.硬件准备 2.开发环境 3.CubeMX配置 三、裸机各种模块测试 1.舵机模块 2.蓝牙模块 3.按键摇杆传感器模块和旋钮电位器模块 4.OLED模块 5.W25Q128模块 四、裸机三种控制测试 1.摇杆控制 2.示教器控制 3.蓝牙控制 五、裸机与Free…

LabVIEW智能温度监控系统

LabVIEW智能温度监控系统 介绍了一个基于LabVIEW的智能温度监控系统&#xff0c;实现对工业环境中温度的实时监控与调控。通过集成传感器技术和LabVIEW软件平台&#xff0c;系统能够自动检测环境温度&#xff0c;及时响应温度变化&#xff0c;并通过图形用户界面(GUI)为用户提…

【头歌·计组·自己动手画CPU】二、运算器设计(讲解版) 【计算机硬件系统设计】

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的很重要&…