《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; // 这会抛出 ArrayIndexOutOfBoundsException
            System.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.mfbz.cn/a/387076.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vuex 模块的详解

Vuex 模块是将 store 分割成多个模块的一种方式&#xff0c;每个模块都有自己的状态、mutations、actions 和 getters。这有助于更好地组织和管理应用程序的状态。 创建模块&#xff1a; 首先&#xff0c;需要创建一个模块。可以在 store 中定义一个新的模块对象&#xff0c…

python小项目----多重剪切板

代码&#xff1a; import shelve,pyperclip,sysimport mcbmcbShelfshelve.open(mcb)# 保存剪切板内容 if len(sys.argv)3 and sys.argv[1].lower()save:#剪切板的内容保存到第三个参数中mcbShelf[sys.argv[2]]pyperclip.paste()print("你的剪切板中的内容将被保存到mcbSh…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 2月14日,星期三

每天一分钟&#xff0c;知晓天下事&#xff01; 2024年2月14日 星期三 农历正月初五 1、 第十四届全国冬季运动会将于17日开幕&#xff0c;部分赛事今天起陆续开赛。 2、 2024年购房政策将进一步宽松&#xff0c;专家称今年买房性价比更高。 3、 春节档票房突破45亿元&#…

算法学习——LeetCode力扣回溯篇2

算法学习——LeetCode力扣回溯篇2 40. 组合总和 II 40. 组合总和 II - 力扣&#xff08;LeetCode&#xff09; 描述 给定一个候选人编号的集合 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字…

(二)【Jmeter】专栏实战项目靶场drupal部署

该专栏后续实战示例&#xff0c;都以该篇部署的项目展开操作。 前置条件 参考“&#xff08;一&#xff09;【Jmeter】JDK及Jmeter的安装部署及简单配置” 安装部署Jmeter&#xff0c;从文章最后下载“Postman、Rancher.ova、VirtualBox-7.0.12-159484-Win.exe、Xshell-7.0.01…

CMU和ETH联合研发了一个名为 「敏捷但安全」的新框架,为四足机器人在复杂环境中实现高速运动提供了解决方案

在高速机器人运动领域&#xff0c;实现同时兼顾速度和安全一直是一大挑战。但现在&#xff0c;卡内基梅隆大学&#xff08;CMU&#xff09;和苏黎世联邦理工学院&#xff08;ETH&#xff09;的研究团队带来了突破性进展。他们开发的新型四足机器人算法&#xff0c;不仅能在复杂…

Leetcode 452. 用最少数量的箭引爆气球435. 无重叠区间

class Solution {public int findMinArrowShots(int[][] points) {Arrays.sort(points,(o1,o2)->Integer.compare(o1[0], o2[0]));int count1;//箭的数量for(int i1;i<points.length;i) {if(points[i][0]>points[i-1][1]) {count;//边界没重合&#xff0c;又需要一支箭…

如何重新安装 macOS

你可以使用电脑的内建恢复系统“macOS 恢复”来重新安装 Mac 操作系统。不但简单快捷&#xff0c;而且重新安装后不会移除你的个人数据。 将 Mac 关机 选取苹果菜单  >“关机”&#xff0c;然后等待 Mac 关机。如果你无法将 Mac 关机&#xff0c;请按住它的电源按钮最长 …

第六篇:MySQL图形化管理工具

经过前五篇的学习&#xff0c;对于数据库这门技术的理解&#xff0c;我们已经在心中建立了一个城堡大致的雏形&#xff0c;通过命令行窗口&#xff08;cmd&#xff09;快速上手了【SQL语法-DDL-数据定义语言】等相关命令 道阻且长&#xff0c;数据库技术这一宝藏中还有数不清的…

猫头虎分享: 探索软件系统架构的革新之路

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

Swift Combine 网络受限时从备用 URL 请求数据 从入门到精通十四

Combine 系列 Swift Combine 从入门到精通一Swift Combine 发布者订阅者操作者 从入门到精通二Swift Combine 管道 从入门到精通三Swift Combine 发布者publisher的生命周期 从入门到精通四Swift Combine 操作符operations和Subjects发布者的生命周期 从入门到精通五Swift Com…

python 基础知识点(蓝桥杯python科目个人复习计划40)

今日复习内容&#xff1a;矩阵乘法&#xff0c;高斯消元 哈哈&#xff0c;我来干回老本行&#xff0c;复习点儿数学类专业学的东西 因为电脑上制作费时间&#xff0c;所以我直接用我的《高等代数》和《数值分析》笔记。 一.矩阵乘法 例题1&#xff1a;矩阵相乘 题目描述&am…

three.js 细一万倍教程 从入门到精通(三)

目录 五、详解PBR材质纹理 5.1、详解PBR物理渲染 5.2、标准网格材质与光照物理效果 5.3、置换贴图与顶点细分设置 5.4、设置粗糙度与粗糙度贴图 5.5、设置金属度与金属贴图 5.6、法线贴图应用 5.7、如何获取各种类型纹理贴图 5.8、纹理加载进度情况 单张图片加载 多…

Java学习手册——第七篇基础语法

Java学习手册——第七篇基础语法 1. 注释2. 顺序语句3. 条件语句3.1 if语句3.2 switch语句 4. 循环语句4.1 for循环4.2 while 语句4.3 do...while语句 本篇为大家快速入门Java基础语法&#xff0c;了解一个语言的基础语法是必要的&#xff0c; 因为我们后期都是需要用这些基础语…

基于CU,PO,RD,IPO矩阵图分析数据资产-自创

术语 数据资产&#xff1a;数据资产是具有价值的数据资源。没有价值的数据资源&#xff0c;通过采集&#xff0c;整理&#xff0c;汇总等加工后&#xff0c;也可以成为具有直接或间接价值的数据资产。传统企业逐渐数字化转型&#xff0c;尤其是互联网企业&#xff0c;都十分重视…

文献速递:肿瘤分割---- 弱监督肝肿瘤分割,使用Couinaud区段标注

文献速递&#xff1a;肿瘤分割---- 弱监督肝肿瘤分割&#xff0c;使用Couinaud区段标注 01 文献速递介绍 肝癌是世界上导致癌症死亡的主要原因之一&#xff0c;也是第二大常见的癌症死因。本稿件于2021年10月28日收到&#xff0c;2021年11月24日修订&#xff0c;2021年12月1…

[Linux开发工具]项目自动化构建工具-make/Makefile

&#x1f4d9; 作者简介 &#xff1a;RO-BERRY &#x1f4d7; 学习方向&#xff1a;致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f4d2; 日后方向 : 偏向于CPP开发以及大数据方向&#xff0c;欢迎各位关注&#xff0c;谢谢各位的支持 目录 1.背景2.依赖关系和依…

【制作100个unity游戏之23】实现类似七日杀、森林一样的生存游戏17(附项目源码)

本节最终效果演示 文章目录 本节最终效果演示系列目录前言制作木板UI直接复制和工具一样的即可检查背包是否有指定数量的空插槽 源码完结 系列目录 前言 欢迎来到【制作100个Unity游戏】系列&#xff01;本系列将引导您一步步学习如何使用Unity开发各种类型的游戏。在这第23篇…

品牌之门:概率与潜力的无限延伸

在品牌的世界里&#xff0c;每一个成功的推广都像是打开一扇门&#xff0c;从未知走向已知&#xff0c;从潜在走向显现。这扇门&#xff0c;既是品牌的起点&#xff0c;也是品牌发展的无限可能。 品牌&#xff0c;就像一扇紧闭的门&#xff0c;它静静地矗立在那里&#xff0c;…

toString()、equals()、clone()用法

Java中所有类的对象都可以直接使用Object类中提供的一些方法 1. toString()&#xff1a;返回对象的字符串表示形式&#xff0c;通常在类中重写&#xff0c;以便于返回的是对象的内容 2. equals()&#xff1a;判断两个对象的地址是否相等&#xff0c;直接使用也一样&#xff0c;…