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());// 其他异常处理逻辑// ...}}
}

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

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

相关文章

【腾讯云 Cloud Studio 实战训练营】Hexo 框架 Butterfly 主题搭建个人博客

什么是Cloud Studio Cloud Studio 是基于浏览器的集成式开发环境&#xff08;IDE&#xff09;&#xff0c;为开发者提供了一个永不间断的云端工作站。用户在使用 Cloud Studio 时无需安装&#xff0c;随时随地打开浏览器就能在线编程。 ​ Hexo 博客成品展示 本人博客如下&…

14-矩阵相乘及其运算法则

矩阵与向量的乘法 在这一篇文章中我们就将基于上一篇重新审视矩阵的这个视点来理解矩阵的乘法&#xff0c;那么在这一篇&#xff0c;我们主要来看一下矩阵和向量的乘法。这里这个线性方程组是上一小节给大家举的模拟的一个非常简单的小型经济系统的例子&#xff0c;我们可以把…

【JAVA】变量的作用域与生存周期

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️初识JAVA】 文章目录 前言变量的作用域变量的生命周期局部变量全局变量 前言 变量&#xff0c;我们学习过程中逃不掉的知识&#xff0c;无论在哪种语言中我们都需要学会去合理的运用它&#xff0c;今…

IP 协议的相关特性和数据链路层相关知识总结

目录 IP 协议的相关特性 一、IP协议的特性 二、 IP协议数据报格式 三、 IP协议的主要功能 1. 地址管理 动态分配 IP地址 NAT机制 NAT背景下的通信 IPV6 2. 路由控制​​​​​​​ 3.IP报文的分片与重组 数据链路层相关知识 1、以太网协议&#xff08;Ethernet&#xff09; 2.M…

Java:正则表达式案例:爬数据,重复数据替换,数据分割

使用正则表达式查找一段文本中的内容 需求:请把下面文本中的电话&#xff0c;邮箱&#xff0c;座机号码&#xff0c;热线都爬取出来。 String data "电话:1866668888&#xff0c;18699997777\n" "或者联系邮箱: boniuitcast.cn&#xff0c;\n" "座机…

Spring的三种异常处理方式

1.SpringMVC 异常的处理流程 异常分为编译时异常和运行时异常&#xff0c;编译时异常我们 try-cache 进行捕获&#xff0c;捕获后自行处理&#xff0c;而运行时异常是不 可预期的&#xff0c;就需要规范编码来避免&#xff0c;在SpringMVC 中&#xff0c;不管是编译异常还是运行…

OpenCV-Python中的图像处理-霍夫变换

OpenCV-Python中的图像处理-霍夫变换 霍夫变换霍夫直线变换霍夫圆环变换 霍夫变换 霍夫(Hough)变换在检测各种形状的技术中非常流行&#xff0c;如果要检测的形状可以用数学表达式描述&#xff0c;就可以是使用霍夫变换检测它。即使要检测的形状存在一点破坏或者扭曲也是可以使…

C++——oo的魅力之多态

文章目录 多态的概念多态的定义和实现多态的构成条件虚函数重写的两个例外协变(基类和派生类虚函数返回值类型不同)析构函数的重写(基类和派生类析构函数名字不同) c11 override 和 final关键字 重载&#xff0c;重写(覆盖)&#xff0c; 隐藏(重定义)对比抽象类(纯虚函数)多态的…

docker安装及优化详解

目录 一、部署20版的docker 1.1 安装依赖包 1.2 设置阿里云镜像源 1.3 安装docker-ce 社区版 1.4 关闭增强机制 1.5 开启服务 1.6 设置镜像加速 1.7 网络优化 二、linux 系统中的命令 记10条(cd ls pwd mv cp ) 2.1 查询docker 版本 2.2 搜索镜像 2.3 技能点 2.…

实例038 设置窗体在屏幕中的位置

实例说明 在窗体中可以设置窗体居中显示&#xff0c;本例通过设置窗体的Left属性和Top属性可以准确设置窗体的位置。运行本例&#xff0c;效果如图1.38所示。 技术要点 设置窗体在屏幕中的位置&#xff0c;可以通过设置窗体的属性来实现。窗体的Left属性表示窗体距屏幕左侧的…

C语言 字符指针

1、介绍 概念&#xff1a; 字符指针&#xff0c;就是字符类型的指针&#xff0c;同整型指针&#xff0c;指针指向的元素表示整型一样&#xff0c;字符指针指向的元素表示的是字符。 假设&#xff1a; char ch a;char * pc &ch; pc 就是字符指针变量&#xff0c;字符指…

Linux安装Docker

一、Docker系统版本介绍 Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的容器中&#xff0c;然后发布到任何流行的 Linux 或 Windows 操作系统的机器上&#xff0c;也可以实现虚拟化。 容器是完全使用沙箱机制&#xff0c;相…

常识判断

头像 carrin&#xff5e;&#x1f47b; 产品经理 225/753 75/302.5 30/152 15/101.5 等差数列&#xff0c;所以最后一个是10/101 收起 60 回复 发布于 2020-02-18 16:33

学习篇之React Fiber概念及原理

什么是React Fibber&#xff1f; React Fiber 是 React 框架的一种底层架构&#xff0c;为了改进 React 的渲染引擎&#xff0c;使其更加高效、灵活和可扩展。 传统上&#xff0c;React 使用一种称为堆栈调和递归算法来处理虚拟 DOM 的更新&#xff0c;这种方法在大型应用或者…

React+Typescript清理项目环境

上文 创建一个 ReactTypescript 项目 我们创建出了一个 React配合Ts开发的项目环境 那么 本文 我们先将环境清理感觉 方便后续开发 我们先来聊一下React的一个目录结构 跟我们之前开发的React项目还是有一些区别 public 主要是存放一些静态资源文件 例如 html 图片 icon之类的 …

用于弥散加权MRI的关节各向异性维纳滤光片研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

CentOS系统环境搭建(三)——Centos7安装DockerDocker Compose

centos系统环境搭建专栏&#x1f517;点击跳转 Centos7安装Docker&Docker Compose 使用 yum 安装Docker 内核 [rootVM-4-17-centos ~]# uname -r 3.10.0-1160.88.1.el7.x86_64Docker 要求 CentOS 系统的内核版本高于 3.10 更新 yum yum update安装需要的软件包&#x…

为什么商业基础软件需要开源

Bytebase 本身是一家商业软件公司&#xff0c;而作为最核心资产的代码从 Day 0 却是开源的。同时我们还是 star-history.com 的运营者&#xff0c;大家在各种开源渠道会看到它生成的图&#xff1a; 一直以来&#xff0c;常会被别人问起的一个问题&#xff0c;就是为什么 Byteba…

使用维纳过滤器消除驾驶舱噪音(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

QT QLCDNumber 使用详解

本文详细的介绍了QLCDNumber控件的各种操作&#xff0c;例如&#xff1a;新建界面、源文件、设置显示位数、设置进制、设置外观、设置小数点、设置溢出、显示事件、其它文章等等操作。 实际开发中&#xff0c;一个界面上可能包含十几个控件&#xff0c;手动调整它们的位置既费时…