Java—Throwing Exceptions

一、指定方法引发的异常

上一节展示了如何为ListOfNumbers类中的writeList()方法编写异常处理程序。有时,代码捕获可能在其中发生的异常是适当的。然而,在其他情况下,最好让调用堆栈更上层的方法处理该异常。例如,如果您将ListOfNumbers类作为类包的一部分提供,则可能无法预测包中所有用户的需求。在这种情况下,最好不要捕获异常,并允许调用堆栈上更高的方法来处理它。
如果writeList()方法没有捕获其中可能发生的已检查异常,则writeList.()方法必须指定它可以引发这些异常。让我们修改原始的writeList()方法,以指定它可以引发的异常,而不是捕获它们。为了提醒您,这里是无法编译的writeList()方法的原始版本。

public void writeList() {PrintWriter out = new PrintWriter(new FileWriter("OutFile.txt"));for (int i = 0; i < SIZE; i++) {out.println("Value at: " + i + " = " + list.get(i));}out.close();
}

要指定writeList()可以引发两个异常,请将throws子句添加到writeList.()方法的方法声明中。throws子句包含throws关键字,后跟该方法引发的所有异常的逗号分隔列表。子句位于方法名称和参数列表之后,以及定义方法范围的大括号之前;这里有一个例子。

public void writeList() throws IOException, IndexOutOfBoundsException {

请记住,IndexOutOfBoundsException是未检查的异常;在throws子句中包含它不是强制性的。您可以只编写以下内容。

public void writeList() throws IOException {

二、如何抛出异常

在捕获异常之前,某个地方的某些代码必须抛出一个异常。任何代码都可能引发异常:您的代码、来自其他人编写的包(如Java平台附带的包)的代码或Java运行时环境。无论是什么引发异常,它总是与throw语句一起引发。
您可能已经注意到,Java平台提供了许多异常类。所有类都是Throwable类的后代,并且都允许程序区分在程序执行期间可能发生的各种类型的异常。
您还可以创建自己的异常类来表示您编写的类中可能发生的问题。事实上,如果您是包开发人员,则可能必须创建自己的一组异常类,以允许用户将包中可能发生的错误与Java平台或其他包中发生的错误区分开来。
您还可以创建链接异常。有关详细信息,请参见连锁异常部分。

三、Throw语句

所有方法都使用throw语句引发异常。throw语句需要单个参数:可丢弃的对象。可抛出对象是Throwable类的任何子类的实例。下面是throw语句的一个示例。

throw someThrowableObject;

让我们看看上下文中的throw语句。下面的pop()方法取自实现公共堆栈对象的类。该方法从堆栈中移除顶部元素并返回对象。

public Object pop() {Object obj;if (size == 0) {throw new EmptyStackException();}obj = objectAt(size - 1);setObjectAt(size - 1, null);size--;return obj;
}

pop()方法检查堆栈上是否有任何元素。如果堆栈为空(其大小等于0),pop将实例化一个新的EmptyStackException对象,该对象是java.util的成员,并抛出它。本章的“创建异常类”部分解释了如何创建自己的异常类。现在,您需要记住的是,只能抛出从java.lang.Throwable类继承的对象。
请注意,pop()方法的声明不包含throws子句。EmptyStackException不是选中的异常,因此不需要pop来声明它可能发生。

四、可抛出类及其子类

从Throwable类继承的对象包括直接后代(直接继承自Throwaable类的对象)和间接后代(继承自Throuwable类的子对象或孙子对象)。下图说明了Throwable类及其最重要的子类的类层次结构。如您所见,Throwable有两个直接后代:Error和Exception。

Throwable层次结构

五、Error Class

当Java虚拟机中发生动态链接故障或其他硬故障时,虚拟机抛出Error。简单的程序通常不会捕获或抛出Error的实例。

六、Exception Class

大多数程序抛出并捕获从Exception类派生的对象。异常表示发生了问题,但不是严重的系统问题。您编写的大多数程序将抛出和捕获Exception实例,而不是Error实例。
Java平台定义了Exception类的许多后代。这些子体表示可能发生的各种类型的异常。例如,IllegalAccessException表示找不到特定方法,NegativeArraySizeException指示程序试图创建大小为负的数组。
一个Exception子类RuntimeException是为指示不正确使用API的异常保留的。运行时异常的一个例子是NullPointerException,当方法试图通过null引用访问对象的成员时,就会发生该异常。未检查的异常-争议一节讨论了为什么大多数应用程序不应引发运行时异常或RuntimeException子类。

七、链式异常

应用程序通常通过引发另一个异常来响应异常。实际上,第一个异常导致第二个异常。知道一个异常何时导致另一个异常非常有用。链式异常有助于程序员做到这一点。
下面是Throwable中支持链接异常的方法和构造函数。

Throwable getCause()
Throwable initCause(Throwable)
Throwable(String, Throwable)
Throwable(Throwable)

initCause()和Throwable构造函数的Throwall参数是导致当前异常的异常。getCause()返回导致当前异常的异常,initCause(”)设置当前异常的原因。
下面的示例演示如何使用链接异常。

try {} catch (IOException e) {throw new SampleException("Other IOException", e);
}

在本例中,当捕获IOException时,将创建一个新的SampleException异常,并附加原始原因,异常链将被抛出到下一个更高级别的异常处理程序。

八、访问堆栈跟踪信息

现在,假设高级异常处理程序希望以自己的格式转储堆栈跟踪。

定义:堆栈跟踪提供有关当前线程的执行历史记录的信息,并列出在异常发生时调用的类和方法的名称。堆栈跟踪是一种有用的调试工具,通常在引发异常时可以利用它。

下面的代码演示如何对异常对象调用getStackTrace()方法。

catch (Exception cause) {StackTraceElement elements[] = cause.getStackTrace();for (int i = 0, n = elements.length; i < n; i++) {       System.err.println(elements[i].getFileName()+ ":" + elements[i].getLineNumber() + ">> "+ elements[i].getMethodName() + "()");}
}

 

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

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

相关文章

51系列--数码管显示的4X4矩阵键盘设计

本文介绍基于51单片机的4X4矩阵键盘数码管显示设计&#xff08;完整Proteus仿真源文件及C代码见文末链接&#xff09; 一、系统及功能介绍 本设计主控芯片选用51单片机&#xff0c;主要实现矩阵键盘对应按键键值在数码管上显示出来&#xff0c;矩阵键盘是4X4共计16位按键&…

工科数学基础系列(1)——矩阵微分

工科数学基础系列文章 下面是工科数学基础系列文章的总链接&#xff0c;本人发表这个系列的文章链接均收录于此 数学基础系列文章链接 下面是专栏地址&#xff1a; 工科数学基础系列专栏 文章目录 工科数学基础系列文章数学基础系列文章链接工科数学基础系列专栏 前言工科数…

系列十二、Linux中安装Zookeeper

一、Linux中安装Zookeeper 1.1、下载安装包 官网&#xff1a;Index of /dist/zookeeper/zookeeper-3.4.11 我分享的链接&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/14Hugqxcgp89f2hqGWDwoBw?pwdyyds 提取码&#xff1a;yyds 1.2、上传至/opt目录 1.3、解…

ffmpeg 解码文件时的时间戳问题

实时流和普通文件 1 实时流 实时流编码时&#xff0c;我们一般不进行b帧编码&#xff0c;但是文件存储时为了减小大小&#xff0c;会增加b帧&#xff0c;实时流只带了I&#xff0c;P帧&#xff0c;那就会好很多 2 普通文件 很多文件带了b帧&#xff0c;所以要使用解码时间去同…

SpringMVC之视图和RESTful

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

Linux 线程安全 (2)

文章目录 线程同步概念条件变量使用生产消费模型信号量的使用读写锁的使用 Linux 线程安全 &#xff08;1&#xff09; 线程同步概念 竞态条件&#xff1a;因为时序问题&#xff0c;而导致程序异常. 饥饿问题&#xff1a;只使用互相锁保证线程安全时&#xff0c;锁资源总被某…

篇章二 | Python 入门指南:深入理解基础数据类型

Python 是一门强大而易学的编程语言&#xff0c;而深刻理解其基础数据类型是掌握 Python 编程的重要一步。本入门指南将详细介绍 Python 中的基础数据类型&#xff0c;包括整数、浮点数、字符串、布尔值、列表、元组、字典和集合等&#xff0c;同时提供注意事项和与 C 语言的区…

【浏览器】Web存储梳理和总结

目录 1. 前言 2. cookie 3. sessionStorage和localStorage 4. indexedDB 4.1 IDBFactory原型对象的方法&#xff08;indexedDB是IDBFactory的实例化对象&#xff09; 4.2 操作请求IDBOpenDBRequest和IDBRequest&#xff08;IDBRequest继承于EventTarget&#xff09; 4.3 …

浅谈【GPU和CPU】

GPU和显卡的区别 GPU&#xff08;Graphics Processing Unit&#xff0c;图形处理器&#xff09;通常指的就是显卡。显卡是一种安装在计算机中的扩展卡&#xff0c;主要用于图形和图像处理任务。 GPU作为显卡的核心组件&#xff0c;负责处理图形渲染、图像处理、视频解码和其他…

每天坐在电脑前10小时的投资者的现货黄金投资秘密

很多人在现货黄金市场中苦作舟&#xff0c;希望通过交易、实践来找出市场中的奥秘。笔者最近看了一个每天坐在电脑面前十个小时以上做分析和投资的投资者的经验介绍&#xff0c;他道出了一些投资的秘密&#xff0c;笔者认为&#xff0c;这是适合现货黄金投资者借鉴和学习的&…

派生类的构造与析构函数(C++)

3.3 派生类的构造与析构函数3.3.1 构造3.3.2 析构 3.3 派生类的构造与析构函数 3.3.1 构造 如果子类构造函数没有显式指明基类部分&#xff08;基类子对象&#xff09;的初始化方式&#xff0c;那么编译器将会自动调用基类的无参构造函数来初始化基类子对象。 如果希望以有参…

java SSM课程平台系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM课程平台系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S…

【方法】Word文档如何设置密码?

Word文档可以设置密码保护&#xff0c;如果想要保护文档不被随意打开&#xff0c;可以设置“打开密码”&#xff1b;如果想保护文档不被随意编辑&#xff0c;可以设置“限制密码”&#xff1b;如果当心自己不小心修改了文档&#xff0c;可以设置“只读模式”密码&#xff0c;使…

一篇文章带你入门PHP魔术方法

PHP魔术方法 PHP 中的"魔术方法"是一组特殊的方法&#xff0c;它们在特定情况下自动被调用。这些方法的名称都是以两个下划线&#xff08;__&#xff09;开头。魔术方法提供了一种方式来执行各种高级编程技巧&#xff0c;使得对象的行为可以更加灵活和强大。以下是一…

DSG YashanDB数据交互解决方案:更稳、更快、更安全

近期&#xff0c;深圳计算科学研究院&#xff08;简称“深算院”&#xff09;携手迪思杰&#xff08;北京&#xff09;数据管理技术有限公司&#xff08;简称“DSG”&#xff09;重磅推出基于崖山数据库的数据交互解决方案&#xff0c;具备双向迁移同步、性能稳定、支持复杂对象…

余弦相似度算法

余弦相似度算法 是什么 余弦距离&#xff0c;也称为余弦相似度&#xff0c;是用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小的度量。 余弦值越接近1&#xff0c;就表明夹角越接近0度&#xff0c;也就是两个向量越相似&#xff0c;这就叫"余弦相似性&q…

表情串转换

前言 NWAFU 2021阶段二 D 一、题目描述 题目描述 在一个字符串中&#xff0c;设置了由‘/’前导字符和某些特定字母构成的转义子字符串&#xff0c;如“/s”、“/f”、“/c”等用于表示特殊表情符号。现要求编写一个函数&#xff0c;将给定字符串中的转义字符串转换为表情字…

AD20PCB笔记(写给第三次重学PCB的自己)

readme&#xff1a;我曾以为自己本科毕业以后&#xff0c;再也不会用到PCB了&#xff0c;因为本科毕设的时候自己设计的PCB开发板出现了严重的设计问题&#xff0c;在实际测试的过程中&#xff0c;电源一上电&#xff0c;板子芯片直接炸飞&#xff0c;当时真的让我很害怕&#…

JavaScript实现视频共享

1.视频共享webrtc-master index.html <!DOCTYPE html> <html> <head><script typetext/javascript srchttps://cdn.scaledrone.com/scaledrone.min.js></script><meta charset"utf-8"><meta name"viewport" cont…

c++学习笔记(10)-可变参数模板

1、概念 可变参数模板&#xff08;Variable Template Parameters&#xff09;是 C11 中引入的一种语法&#xff0c;它允许函数或类模板接受可变数量的参数。这样可以方便地定义操作适用于多个类型和/或值的函数或类模板。 使用可变参数模板时&#xff0c;可以在模板参数列表中…