Java基础篇--错误处理机制

尽管人人希望自己身体健康,处理的事情都能顺利进行,但在实际生活中总会遇到各种状况,比如感冒发烧,工作时电脑蓝屏、死机等。同样,在程序运行的过程中,也会发生各种非正常状况,例如,程序运行时磁盘空间不足、网络连接中断、被装载的类不存在等。针对这种情况, Java语言引入了异常,以异常类的形式对这些非正常情况进行封装,通过错误处理机制对程序运行时发生的各种问题进行处理。

Java的错误处理机制是通过异常(Exception)来实现的。异常是在程序执行过程中出现的问题或错误的一种表示,它可以帮助我们识别和处理程序中的异常情况,从而保证程序的稳定性和可靠性。

异常类层次结构:

Java中的异常被组织成一个类层次结构。所有的异常都是Throwable类的子类,Throwable又分为两个子类:Error(错误类)和Exception(异常类)。其中,Error表示严重的系统级问题,通常是由虚拟机或底层资源引起的,例如内存溢出(OutOfMemoryError)。而Exception则表示可以被捕获和处理的异常情况,包括检查异常和运行时异常。

在Exception(异常类)类的众多子类中有一个特殊的子类—RuntimeException类,RuntimeException类及其子类用于表示运行时异常。 Exception类的其他子类都用于表示编译时异常。Java提供了大量的异常类,这些类都继承自java.lang.Throwable类。接下来通过一张图展示Throwable类的继承体系。

Throwable类中的常用方法如下表。

方法声明

功能描述

String getMessage()

返回异常的消息字符串 

String toString()

返回异常的简单信息描述

void printStackTrace()

获取异常类名和异常信息,以及异常出现在程序中的位置,

把信息输出在控制台。

检查异常:

这些异常是在编译时强制检查的异常。它们通常涉及到外部资源的操作,如文件I/O、网络连接等。开发者必须显式地处理或声明抛出这些异常。通过捕获和处理检查异常,可以使代码更加健壮,防止未处理异常导致程序崩溃或不可预测的结果。开发者需要使用 try-catch 块来捕获这些异常,并进行相应的处理。

try…catch具体语法格式如下:

try {
    // 可能引发异常的代码块
} catch (异常类型1 异常变量1) {
    // 处理异常类型1的情况
} catch (异常类型2 异常变量2) {
    // 处理异常类型2的情况
} catch (异常类型3 异常变量3) {
    // 处理异常类型3的情况
}

注意:catch代码块需要一个参数指明它所能够接收的异常类型,这个参数的类型必须是Exception类或其子类。 

运行时异常:

这些异常是不需要显式处理的异常,也不需要在方法签名中声明抛出。它们主要包括空指针引用(NullPointerException)、数组下标越界(ArrayIndexOutOfBoundsException)、类型转换错误(ClassCastException)等。运行时异常通常由程序逻辑错误导致,因此应该通过改进代码逻辑来预防发生这些异常。

下面是一个使用 try-catch 语句模仿数组下标越界的代码示例: 

public class myClass {
    public static void main(String[] args) {
        try {
            int[] numbers = {1, 2, 3};
            System.out.println(numbers[4]); // 数组越界,会引发 ArrayIndexOutOfBoundsException 异常
        } catch (Exception e) {
            System.out.println("捕获到异常:" + e);//输出:捕获到异常:java.lang.ArrayIndexOutOfBoundsException: 4
        }
    }
}

异常处理语句:

Java提供了try-catch-finally的异常处理语句来捕获异常并进行相应的处理。在try块中编写可能会抛出异常的代码,如果发生了对应的异常,就会跳转到与之匹配的catch块中进行处理。catch块可以捕获特定类型的异常,也可以使用多个catch块按顺序处理不同类型的异常。finally块用于定义无论是否发生异常都要执行的代码,例如释放资源、关闭文件等。无论是否有异常发生,finally块中的代码都会执行。这样可以进行必要的清理工作,避免资源泄漏等问题。

注意:finally中的代码块在一种情况下是不会执行的,那就是在try...catch中执行了System.exit(0)语句。System.exit(0)表示退出当前的Java虚拟机,Java虚拟机停止了,任何代码都不能再执行了。

下面是一个使用 try-catch-finally 异常处理语句的代码示例:

public class myClass {
    public static void main(String[] args) {
        try {
            int result = divideNumbers(10, 0); // 调用自定义方法,可能触发 ArithmeticException 异常
            System.out.println("结果:" + result);
        } catch (ArithmeticException e) {
            System.out.println("捕获到异常:" + e);
        } finally {
            System.out.println("无论是否发生异常,finally 块中的代码都会执行");
        }

        System.out.println("try-catch-finally 语句块之外的代码");
    }

    public static int divideNumbers(int a, int b) {
        return a / b; // 若除数为 0,则会触发 ArithmeticException 异常
    }
}

运行结果:

捕获到异常:java.lang.ArithmeticException: / by zero
无论是否发生异常,finally 块中的代码都会执行
try-catch-finally 语句块之外的代码

抛出异常:

在方法中,我们可以使用throw关键字主动抛出异常。通过throw语句,我们可以在任何需要的地方抛出异常,并将其传递给上层调用者来处理。抛出异常的过程中,当前方法的执行将被中断,然后异常被传递给调用堆栈中的上一级调用方法。

throws关键字声明抛出异常的语法格式如下:

修饰符 返回类型 方法名(参数列表) throws 异常类型1, 异常类型2, ... {
    // 方法体
}

其中:

  • 修饰符:表示方法的可见性和其他修饰符(例如 public、private、static 等)。
  • 返回类型:表示方法返回值的类型。
  • 方法名:表示方法的名称。
  • 参数列表:表示方法接收的参数。
  • 异常类型1, 异常类型2, ...:表示方法可能抛出的异常类型。多个异常类型之间使用逗号分隔。

下面是一个使用 throw 关键字的代码示例:

public class myClass {
    public static void main(String[] args) {
        try {
            int result = divideNumbers(10, 0); // 调用自定义方法,可能触发 ArithmeticException 异常
            System.out.println("结果:" + result);
        } catch (ArithmeticException e) {
            System.out.println("捕获到异常:" + e);//输出:捕获到异常:java.lang.ArithmeticException: / by zero
        } finally {
            System.out.println("无论是否发生异常,finally 块中的代码都会执行");//输出:无论是否发生异常,finally 块中的代码都会执行
        }

        System.out.println("try-catch-finally 语句块之外的代码");
    }

    public static int divideNumbers(int a, int b) throws ArithmeticException{
        if (b == 0) {
            throw new ArithmeticException("除数不能为零"); // 抛出 ArithmeticException 异常对象
        } else {
            int result = a / b;
            System.out.println("结果:" + result);
        }
        return a;
    }
}

运行结果:

捕获到异常:java.lang.ArithmeticException: 除数不能为零
无论是否发生异常,finally 块中的代码都会执行
try-catch-finally 语句块之外的代码

自定义异常:

除了Java内置的异常类,开发者还可以根据需要自定义异常类。自定义异常类需要继承Exception或其子类,并根据具体需求添加自己所需的字段和方法。自定义异常可以更好地满足业务需求,提供更准确的异常信息和处理方式。

在实际开发中,如果没有特殊的要求,自定义的异常类只需继承Exception类,在构造方法中使用super()语句调用Exception的构造方法即可。

自定义异常类中使用throw关键字在方法中声明异常的实例对象,格式如下:

throw Exception异常对象

下面是一个简单的自定义异常类的示例:

// 自定义异常类
class NegativeNumberException extends Exception {
    public NegativeNumberException(String message) {
        super(message);
    }
}

// 示例类
public class myClass {
    // 计算平方根的方法
    public static double calculateSquareRoot(double number) throws NegativeNumberException {
        if (number < 0) {
            throw new NegativeNumberException("输入不能为负数");
        } else {
            // 使用 Math.sqrt() 方法计算平方根
            double squareRoot = Math.sqrt(number);
            return squareRoot;
        }
    }

    // 主方法
    public static void main(String[] args) {
        double input = -5.0;

        try {
            // 调用 calculateSquareRoot 方法
            double result = calculateSquareRoot(input);
            System.out.println("平方根结果:" + result);
        } catch (NegativeNumberException e) {
            System.out.println("捕获到自定义异常:" + e.getMessage());
            // 其他异常处理逻辑
            // ...
        }
    }
}

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

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

相关文章

Vue中拖动排序功能,引入SortableJs,前端拖动排序。

背景&#xff1a; 作为一名前端开发人员&#xff0c;在工作中难免会遇到拖拽功能&#xff0c;分享一个github上一个不错的拖拽js库&#xff0c;能满足我们在项目开发中的需要&#xff0c;支持Vue和React&#xff0c;下面是我在vue后台项目中中使用SortableJS的使用详细流程&am…

绿盾客户端文件加密不显示锁的图标,加密功能正常

环境: 绿盾客户端7.0 Win10 专业版 问题描述: 绿盾客户端文件加密不显示锁的图标,加密功能正常 解决方案: 1.查看控制台是否设置隐藏图标 (未解决) 控制台-规则中心-安全选项-“加密文件显示加密图标”和“不显示Explorer 鼠标右键菜单”是否打钩 如果没打钩,则不…

编程练习(1)

目录 一.选择题 第一题&#xff1a; 第二题&#xff1a; 第三题&#xff1a; 第四题&#xff1a; 第五题&#xff1a; ​编辑 二.编程题 第一题&#xff1a; 第二题&#xff1a; 1.暴力方法&#xff1a; 2.数组法&#xff1a; 一.选择题 第一题&#xff1a; 解析&…

搭建Excel服务器

1、下载Excel服务器 下载地址 2、解压文件 3、打开服务器 4、服务器运行信息 5、连接测试 打开客户端 6、登录到服务器 默认账号 密码 admin 3 修改文件保存路径(服务器端点击配置) 7、客户端整体界面 8、配置权限 9、设计模板 10、其他用户登录就可以填写信息 11、用户&#…

SpingBoot-Vue前后端——实现CRUD

目录​​​​​​​ 一、实例需求 ⚽ 二、代码实现 &#x1f3cc; 数据库 &#x1f440; 后端实现 &#x1f4eb; 前端实现 &#x1f331; 三、源码下载 &#x1f44b; 一、实例需求 ⚽ 实现一个简单的CRUD&#xff0c;包含前后端交互。 二、代码实现 &#x1f3cc; 数…

java:JDBC

文章目录 什么是JDBCJDBC使用步骤详解各个对象DriverManagerConnectionStatementResultSetPreparedStatement JDBC控制事务操作步骤示例 什么是JDBC 我们知道&#xff0c;数据库有很多种&#xff0c;比如 mysql&#xff0c;Oracle&#xff0c;DB2等等&#xff0c;如果每一种数…

SpringCloud初识

微服务架构4个核心问题&#xff1a; 这四个问题围绕这我们去学的一些东西&#xff0c;是重点!!! 1.服务很多&#xff0c;客户端该如何访问&#xff1f; 2.这么多服务&#xff0c;服务之间该如何通信&#xff1f; 3.这么多服务&#xff0c;该如何治理&#xff1f; 4.服务挂了…

光致发光荧光量子产率测试系统

荧光量子产率&#xff0c;是单位时间&#xff08;s&#xff09;内&#xff0c;发射荧光的光子数与吸收激发光的光子数之间的比值&#xff0c;符号φf。它表示物质将吸收的光能转变成荧光的能力&#xff0c;是荧光物质一个最基本而重要的参数。φf值的大小与物质的化学结构紧密相…

flex布局 vs grid布局

问题&#xff1a;一行最多显示3个item&#xff0c;实现最后一行居左 <div class"chart-wrap"><div class"chart-item">图</div><div class"chart-item">图</div><div class"chart-item">图</…

手机商城网站的分析与设计(论文+源码)_kaic

目录 摘 要 1 1 绪论 2 1.1选题背景意义 2 1.2国内外研究现状 2 1.2.1国内研究现状 2 1.2.2国外研究现状 3 1.3研究内容 3 2 网上手机商城网站相关技术 4 2.1.NET框架 4 2.2Access数据库 4 2.3 JavaScript技术 4 3网上手机商城网站分析与设…

C++之std::list<string>::iterator迭代器应用实例(一百七十九)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

Azure创建第一个虚拟机

首先&#xff0c;登录到 Azure 门户 (https://portal.azure.com/)。在 Azure 门户右上角&#xff0c;点击“虚拟机”按钮&#xff0c;并点击创建&#xff0c;创建Azure虚拟机。 在虚拟机创建页面中&#xff0c;选择所需的基本配置&#xff0c;包括虚拟机名称、操作系统类型和版…

git切换分支代码到某一次commit提交

git切换分支代码到某一次commit提交 当前分支切换到某一次提交&#xff1a; git chekcout <commit_id> 切换到某一次commit提交&#xff0c;并以那次commit提交新建一个分支&#xff1a; git branch <new-branch-name> <commit_id> 放弃所有代码文件修改&…

QT的界面切换

QT的界面切换 步骤一: 创建一个新的 ui 界面

基于Java+SpringMVC+Mybaties+layui+Vue+elememt基于协同过滤的电影推荐系统的设计与实现

一.项目介绍 基于协调过滤的电影推荐系统的设计与实现 本系统分为普通用户以及管理员两类 普通用户&#xff1a; 登录系统查看最新推荐电影、收藏、评论、查看电影信息、 对电影进行评分、浏览电影资讯信息、查看个人信息以及浏览收藏…

《游戏编程模式》学习笔记(四) 观察者模式 Observer Pattern

定义 观察者模式定义了对象间的一种一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖于它的对象都得到通知并被自动更新。 这是定义&#xff0c;看不懂就看不懂吧&#xff0c;我接下来举个例子慢慢说 为什么我们需要观察者模式 我们看一个很简…

Spyglass 脚本

Spyglass小白可以使用Gui界面进行debug Spyglass检查(一)作为IC设计人员&#xff0c;熟练掌握数字前端语法检查工具Spyglass的重要性不言而喻&#xff0c;本文讲解景芯SoChttps://mp.weixin.qq.com/s/fp07o-AvaQvLT79Di0Tb7A 熟悉电路和软件之后可以使用脚本完成整个流程 sp…

IDEA全局设置MyBatis中写SQL语句提示

第一步&#xff1a;把这两个设置改成MySQL即可&#xff1a; 第二步&#xff1a;找到设置>编辑器>语言注入>店家加号&#xff0c;选择MySQL

Flink CDC系列之:TiDB CDC 导入 Elasticsearch

Flink CDC系列之&#xff1a;TiDB CDC 导入 Elasticsearch 一、通过docker 来启动 TiDB 集群二、下载 Flink 和所需要的依赖包三、在TiDB数据库中创建表和准备数据四、启动Flink 集群&#xff0c;再启动 SQL CLI五、在 Flink SQL CLI 中使用 Flink DDL 创建表六、Kibana查看Ela…

Matplotlib绘图知识小结--Python数据分析学习

一、Pyplot子库绘制2D图表 1、Matplotlib Pyplot Pyplot 是 Matplotlib 的子库&#xff0c;提供了和 MATLAB 类似的绘图 API。 Pyplot 是常用的绘图模块&#xff0c;能很方便让用户绘制 2D 图表。 Pyplot 包含一系列绘图函数的相关函数&#xff0c;每个函数会对当前的图像进行…