Java异常基础

一、什么是异常

  1. 定义
    • 在Java中,异常是在程序执行期间发生的事件,它中断了指令的正常流程。异常可以是由程序本身产生的错误,例如除以零的操作,也可以是由外部因素引起的,比如试图读取一个不存在的文件。
  2. 异常类层次结构
    • 在Java中,所有的异常类都继承自java.lang.Throwable类。Throwable类有两个重要的子类:ExceptionError
    • Exception类:表示程序本身可以处理的异常情况。例如FileNotFoundException(当试图打开一个不存在的文件时抛出)、ArithmeticException(进行非法的算术运算,如除以零)等。
    • Error类:表示严重的错误,通常是由Java虚拟机(JVM)内部错误或者资源耗尽等严重问题导致的,程序通常无法处理这些错误。例如OutOfMemoryError
一、常见的Exception类及对应的异常情况
  1. ArithmeticException(算术异常)
    • 异常情况:发生在进行非法的算术运算时,如除以零。
    • 示例用法
try {int num1 = 10;int num2 = 0;int result = num1/num2;
} catch (ArithmeticException e) {System.out.println("算术运算错误:" + e.getMessage());
}
  1. ArrayIndexOutOfBoundsException(数组下标越界异常)
    • 异常情况:当访问数组元素时使用了超出数组范围的下标。
    • 示例用法
try {int[] arr = {1, 2, 3};int element = arr[3];
} catch (ArrayIndexOutOfBoundsException e) {System.out.println("数组下标越界:" + e.getMessage());
}
  1. NullPointerException(空指针异常)
    • 异常情况:当试图访问一个空对象的成员(如方法或变量)时发生。
    • 示例用法
try {String str = null;int length = str.length();
} catch (NullPointerException e) {System.out.println("空指针异常:" + e.getMessage());
}
  1. FileNotFoundException(文件未找到异常)
    • 异常情况:当试图打开一个不存在的文件时抛出。
    • 示例用法(假设读取文件操作)
import java.io.File;
import java.io.FileReader;
import java.io.IOException;try {File file = new File("nonexistent.txt");FileReader reader = new FileReader(file);
} catch (FileNotFoundException e) {System.out.println("文件未找到:" + e.getMessage());
} catch (IOException e) {// 捕获其他可能的I/O异常System.out.println("I/O异常:" + e.getMessage());
}
  1. NumberFormatException(数字格式异常)
    • 异常情况:当试图将一个不符合数字格式的字符串转换为数字类型(如Integer.parseIntDouble.parseDouble)时发生。
    • 示例用法
try {String numStr = "abc";int num = Integer.parseInt(numStr);
} catch (NumberFormatException e) {System.out.println("数字格式异常:" + e.getMessage());
}
二、如何确定要写什么异常处理
  1. 分析代码逻辑
    • 查看可能出现问题的代码操作。例如,如果有除法运算,就可能出现ArithmeticException;如果有数组访问,就可能出现ArrayIndexOutOfBoundsException
  2. 考虑对象的状态
    • 当使用对象时,如果对象可能为null,就要考虑NullPointerException。比如在使用从其他地方获取的对象引用,且没有进行null检查的情况下。
  3. 遵循Java API的文档说明
    • 当使用Java类库中的方法时,查看方法的文档,了解可能抛出的异常类型。例如,FileReader的构造函数可能抛出FileNotFoundException,根据文档就可以在代码中进行相应的异常处理。

二、异常处理机制

  1. try - catch块
    • try块:包含可能会抛出异常的代码。例如:
try {int result = 10 / 0;
} catch (ArithmeticException e) {// 这里处理ArithmeticException异常System.out.println("除数不能为零:" + e.getMessage());
}
  • catch块:用于捕获并处理try块中抛出的异常。可以有多个catch块来捕获不同类型的异常。catch块中的参数是一个异常对象,通过这个对象可以获取异常的相关信息,如异常的消息等。
  1. finally块
    • finally块是可选的,但是如果存在,则不管try块中是否抛出异常,finally块中的代码都会被执行。例如:
try {// 可能抛出异常的代码
} catch (Exception e) {// 处理异常
} finally {// 这里的代码总是会执行,例如关闭资源(文件流、数据库连接等)
}

异常处理机制(try - catch - finally)的进一步解释
  1. try - catch块的本质是处理异常情况
    • 当我们编写代码时,有些操作可能会出错,例如访问数组元素时可能超出数组范围。在try块中,我们放置这些可能会出错的代码。当错误(异常)发生时,程序不会直接崩溃,而是会跳转到对应的catch块中。
    • 例如,假设我们有一个数组int[] arr = {1, 2, 3};,如果我们不小心写成int num = arr[5];(超出了数组的索引范围),这就会产生ArrayIndexOutOfBoundsException。如果没有try - catch块,程序会因为这个错误而终止运行。但如果我们把这段代码放在try块中,像这样:
try {int[] arr = {1, 2, 3};int num = arr[5];
} catch (ArrayIndexOutOfBoundsException e) {System.out.println("数组索引超出范围,请检查代码:" + e.getMessage());
}
  • 程序就会捕获这个异常,执行catch块中的代码,然后继续执行catch块之后的其他代码,而不是直接崩溃。
  1. finally块是资源管理的保障
    • 有时候我们在try块中会打开一些资源,比如文件流或者数据库连接。无论try块中的操作是否成功(也就是无论是否抛出异常),我们都希望能够关闭这些资源,以避免资源泄漏(例如文件被占用无法删除,数据库连接过多等问题)。
    • 例如,当我们打开一个文件进行读取操作时:
FileReader reader = null;
try {File file = new File("test.txt");reader = new FileReader(file);// 读取文件内容的操作
} catch (FileNotFoundException e) {System.out.println("文件未找到:" + e.getMessage());
} finally {if (reader!= null) {try {reader.close();} catch (IOException e) {System.out.println("关闭文件时出错:" + e.getMessage());}}
}
  • 在这个例子中,即使在try块中打开文件时出现FileNotFoundExceptionfinally块中的代码也会尝试关闭文件流(如果已经成功打开的话)。

三、抛出异常

  1. throw关键字
    • 可以使用throw关键字在方法内部主动抛出一个异常。例如:
public void divide(int a, int b) {if (b == 0) {throw new ArithmeticException("除数不能为零");}int result = a / b;
}
  1. 声明异常(throws关键字)
    • 如果一个方法可能会抛出某种异常,但是不想在方法内部处理这个异常,可以使用throws关键字在方法签名中声明这个异常。例如:
public void readFile() throws FileNotFoundException {// 代码可能会抛出FileNotFoundException
}

通过合理地使用Java异常处理机制,可以提高程序的健壮性和可靠性,使程序能够更好地应对各种可能出现的错误情况。

抛出异常(throw和throws)的进一步解释
  1. throw是主动报告错误
    • 假设我们正在编写一个方法来计算两个数的除法,但是我们不希望除数为0。我们可以在方法内部使用throw来主动抛出一个异常,以表示这种错误情况。
public static int divide(int dividend, int divisor) {if (divisor == 0) {throw new ArithmeticException("除数不能为零");}return dividend / divisor;
}
  • 这里,当divisor为0时,我们不是简单地让程序产生一个默认的错误(这可能会导致程序崩溃或者产生难以理解的结果),而是主动抛出一个明确的ArithmeticException,并且附上了错误消息“除数不能为零”。
  1. throws是传递异常处理责任
    • 考虑这样一种情况,我们有一个方法methodA调用了另一个方法methodB,而methodB可能会抛出异常。如果methodA本身不知道如何处理这个异常,它可以使用throws关键字将异常处理的责任传递给调用methodA的方法。
public static void methodB() throws FileNotFoundException {File file = new File("nonexistent.txt");FileReader reader = new FileReader(file);
}public static void methodA() throws FileNotFoundException {methodB();
}
  • 在这个例子中,methodB可能会抛出FileNotFoundExceptionmethodA调用methodB,但是methodA不想处理这个异常,所以它在自己的方法签名中使用throws关键字声明可能会抛出FileNotFoundException。这样,调用methodA的方法就需要处理这个异常了。

四、异常类型声明 

ArithmeticExceptionNullPointerExceptionFileNotFoundException

  1. 类型匹配原则

    • catch块中的ArithmeticException eNullPointerException eFileNotFoundException e等语句里,前面的部分(如ArithmeticExceptionNullPointerExceptionFileNotFoundException)代表的是异常类型。
    • 这意味着catch块将只捕获指定类型的异常。例如,catch (ArithmeticException e)只会捕获在try块中抛出的ArithmeticException类型的异常。如果try块中抛出了其他类型的异常(如NullPointerException),这个catch块将不会捕获它。
  2. 异常类层次结构的影响

    • 在Java中,异常类有层次结构。如果一个catch块声明的异常类型是某个异常类的父类,那么它可以捕获该父类及其所有子类类型的异常。
    • 例如,ExceptionArithmeticExceptionNullPointerExceptionFileNotFoundException等许多异常类的父类。如果有catch (Exception e)这样的语句,它可以捕获所有这些类型的异常。但是,通常建议尽量使用具体的异常类型进行捕获,这样可以更有针对性地处理不同类型的异常。

五、异常类型名字后的变量 如ArithmeticException e中的e

  1. 变量命名规则

    • catch块中,(ArithmeticException e)(NullPointerException e)或者(FileNotFoundException e)里的e只是一个变量名。这个变量名可以按照Java的变量命名规则进行修改。
    • 例如,可以写成(ArithmeticException ex)或者(NullPointerException error)等。
  2. 变量的意义

    • 这个变量代表捕获到的异常对象。通过这个对象,我们可以获取关于异常的各种信息,例如异常的类型(通过getClass()方法)、异常的消息(通过getMessage()方法)以及异常发生时的堆栈跟踪信息(通过printStackTrace()方法)等。

    • 例如:

try {// 可能抛出异常的代码
} catch (ArithmeticException myException) {System.out.println("捕获到的异常类型:" + myException.getClass().getName());System.out.println("异常消息:" + myException.getMessage());myException.printStackTrace();
}
  • 在这个例子中,myException是我们自定义的变量名,它的功能和使用e作为变量名是一样的,都是用来操作捕获到的异常对象。

 

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习—正则化和偏差或方差

正则化参数的选择对偏差和方差的影响 用一个四阶多项式,要用正则化拟合这个模型,这里的lambda的值是正则化参数,它控制着你交易的金额,保持参数w与训练数据拟合,从将lambda设置为非常大的值的示例开始,例如…

【笔记】企业架构TOGAF 10的架构从4A增加至6A

背景 谈谈学习TOGAF 10的总结和笔记,说说较9.2版本有哪些变化。最直观的当属从原来的4A架构升级到6A架构,单独从原来的4A中提炼形成了安全架构、系统架构两个概念,谈谈理解并回顾总结一下学习笔记。 TOGAF 10 将安全架构单独列为一种架构&…

AI写作(十)发展趋势与展望(10/10)

一、AI 写作的崛起之势 在当今科技飞速发展的时代,AI 写作如同一颗耀眼的新星,迅速崛起并在多个领域展现出强大的力量。 随着人工智能技术的不断进步,AI 写作在内容创作领域发挥着越来越重要的作用。据统计,目前已有众多企业开始…

【模块一】kubernetes容器编排进阶实战之资源管理核心概念

kubernetes 资源管理核心概念 k8s的设计理念—分层架构 CRI-container runtime interface-容器运行接口 CNI-container network interface-容器网络接口 CSI-container storage interface-容器存储接口 k8s的设计理念—API设计原则 https://www.kubernetes.org.cn/kubernete…

DBeaver中PostgreSQL数据库显示不全的解决方法

本文介绍在DBeaver中,连接PostgreSQL后,数据库显示不全的解决方法。 最近,在DBeaver中连接了本地的PostgreSQL数据库。但是连接后打开这个数据库时发现,其所显示的Databases不全。如下图所示,Databases只显示了一个pos…

ElasticSearch学习笔记二:使用Java客户端

一、前言 在上一篇文章中&#xff0c;我们对ES有了最基本的认识&#xff0c;本着实用为主的原则&#xff0c;我们先不学很深的东西&#xff0c;今天打算先学习一下ES的Java客户端如何使用。 二、创建项目 1、普通Maven项目 1、创建一个Maven项目 2、Pom文件 <dependenc…

MySQL8 安装教程

一、从官网下载mysql-8.0.18-winx64.zip安装文件&#xff08; 从 https://dev.mysql.com/downloads/file/?id484900 下载zip版本安装包 mysql-8.0.18-winx64.zip 解压到本地磁盘中&#xff0c;例如解压到&#xff1a;D盘根目录&#xff0c;并改名为MySQL mysql-8.0.34-winx6…

如何将LiDAR坐标系下的3D点投影到相机2D图像上

将激光雷达点云投影到相机图像上做数据层的前融合&#xff0c;或者把激光雷达坐标系下标注的物体点云的3d bbox投影到相机图像上画出来&#xff0c;都需要做点云3D点坐标到图像像素坐标的转换计算&#xff0c;也就是LiDAR 3D坐标转像素坐标。 看了网上一些文章都存在有错误或者…

【Pikachu】XML外部实体注入实战

若天下不定&#xff0c;吾往&#xff1b;若世道不平&#xff0c;不回&#xff01; 1.XXE漏洞实战 首先写入一个合法的xml文档 <?xml version "1.0"?> <!DOCTYPE gfzq [<!ENTITY gfzq "gfzq"> ]> <name>&gfzq;</name&…

游戏引擎学习第13天

视频参考:https://www.bilibili.com/video/BV1QQUaYMEEz/ 改代码的地方尽量一张图说清楚吧,懒得浪费时间 game.h #pragma once #include <cmath> #include <cstdint> #include <malloc.h>#define internal static // 用于定义内翻译单元内部函数 #…

(一)Ubuntu20.04服务器端部署Stable-Diffusion-webui AI绘画环境

一、说明 cup型号&#xff1a; Intel(R) Celeron(R) CPU G1610 2.60GHz 内存大小&#xff1a; 7.5Gi 356Mi 4.6Gi 1.0Mi 2.6Gi 6.8Gi Swap: 4.0Gi 0B 4.0Gi 显卡型号&#xff1a;NVIDIA P104-100 注意&#xff1a…

Python Tornado框架教程:高性能Web框架的全面解析

Python Tornado框架教程&#xff1a;高性能Web框架的全面解析 引言 在现代Web开发中&#xff0c;选择合适的框架至关重要。Python的Tornado框架因其高性能和非阻塞I/O特性而备受青睐。它特别适合处理大量并发连接的应用&#xff0c;比如聊天应用、实时数据处理和WebSocket服务…

ubuntu20.04安装anaconda

在anaconda的官网&#xff08;Anaconda | The Operating System for AI&#xff09;或者清华镜像源网站&#xff08;Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror&#xff09;中下载对应的anaconda版本 可以在网页直接下载或者通过命…

平衡二叉搜索树之 红黑 树的模拟实现【C++】

文章目录 红黑树的简单介绍定义红黑树的特性红黑树的应用 全部的实现代码放在了文章末尾准备工作包含头文件类的成员变量和红黑树节点的定义 构造函数和拷贝构造swap和赋值运算符重载析构函数findinsert【重要】第一步&#xff1a;按照二叉搜索树的方式插入新节点第二步&#x…

【设计模式】行为型模式(四):备忘录模式、中介者模式

行为型模式&#xff08;四&#xff09;&#xff1a;备忘录模式、中介者模式 7.备忘录模式&#xff08;Memento&#xff09;7.1 通俗易懂的解释7.2 具体步骤7.3 代码示例7.3.1 定义发起人7.3.2 定义备忘录7.3.3 定义管理者7.3.4 客户端7.3.5 输出 7.4 总结 8.中介者模式&#xf…

Thinkpad E15 在linux下升级 bios

安装xubuntu 24.04后&#xff0c;发现键盘的Fn按键全都无法使用&#xff0c;在Windows环境下是正常的&#xff0c;按说是驱动的问题&#xff0c;网上也有说可以通过升级BIOS解决&#xff0c;所以打算升级看看&#xff0c;升级有风险。 参考&#xff1a; https://blog.stigok.c…

Java学习Day61:薄纱王灵官!(Nginx review)

1.Nginx是什么 Nginx是一款轻量级、高性能&#xff0c;并发性好的HTTP和反向代理服务器 2.功能 2.1反向代理 正向代理是指客户端向代理服务器发送请求&#xff0c;代理服务器代表客户端去访问目标服务器。简单来说&#xff0c;正向代理是客户端的代理&#xff0c;客户端通过…

MATLAB用到的矩阵基础知识(矩阵的乘和矩阵的逆)

1. 矩阵乘法 方法: 设第一个矩阵为 A A A,第二个矩阵为 B B B,则 A A A的第一行乘 B B B的第一列,先想乘再相加,作为目标矩阵的一个元素。 前提条件: 所以我们可以看到矩阵相乘的前提条件:第一个矩阵的列数等于第二个矩阵的行数。否则,我们就无法进行行和列的相乘。 最…

Oracle OCP认证考试考点详解082系列22

题记&#xff1a; 本系列主要讲解Oracle OCP认证考试考点&#xff08;题目&#xff09;&#xff0c;适用于19C/21C,跟着学OCP考试必过。 105. 第105题&#xff1a; 题目 解析及答案&#xff1a; 题目翻译&#xff1a; 关于Oracle数据库中的事务请选择两个正确的陈述&#xf…