热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

异常、抛出异常、捕获异常浅析

一、异常所有的异常均由Throwable继承而来、在下一层分成两个子异常。Error描述的是java运行时系统的内部错误和资源耗尽错误。例如:虚拟机错误和线程死锁。一旦出错,程序必

一、异常

所有的异常均由Throwable继承而来、在下一层分成两个子异常。
Error描述的是java运行时系统的内部错误和资源耗尽错误。例如:虚拟机错误和线程死锁。一旦出错,程序必挂。
Exception又有两个分支,分别是RuntimeException和IOException。
在这里插入图片描述
例如编程错误就属于RuntimeException,包括空指针异常(NullPointerException)、数组越界异常(ArrayIndexOutOfBoundsException)、错误的强制类型转换(ClassCastException)、算数异常(ArithmeticException)等。这一类错误可以通过修改代码解决。只要出现RuntimeException就一定是你自身的错误。

Exception分为非检查型异常和检查性异常:
非检查性异常:派生于Error类和RuntimeException的异常称为非检查型异常。
检查性异常:非检查性异常之外的异常为检查性异常,该异常我们必须手动在代码里添加捕获语句来处理该异常

二、抛出和捕获异常

1、throw和throws:

//意为:抛出xxx异常,一定会抛出,是一个动作。常出现于函数体内。thrownewNullPointerException();//意为:可能抛出xxx异常,代表一种可能性。常出现于函数头。
StringreadDate()throws(NullPointerException,ArrayIndexOutOfBoundsException)

2、创建异常类

classMyExceptionextendsException{publicMyException(){}publicMyException(String a){super(a);}}

3、捕获异常

6代表执行完finally块后执行的第一条语句

try{//1
	statements;//2}catch{//3
	statements;//4}finally{//5
	statements;}//6

try块中没有遇到错误,则执行顺序:1256
try块遇到错误,catch中没错,顺序:13456
try块遇到错误,catch遇到错误,顺序:135
try块遇到错误,没有合适的catch块捕获异常,顺序:15

如果finally块抛出异常,则移步finally块中的语句要是也抛出异常怎么处理呢查看解决方法。

下面这种方案更清楚也更强:将会报告finally子句中出现的错误。

InputStream in=...;try{try{//可能会出错的代码}finally{
		in.close();}}catch{//处理异常信息}

内层try块确保关闭输入流;外层try块确保报告出现的错误。在java9后可以在try中提供之前声明的最终变量

4.捕获多个异常

try{//...}catch(FileNotFoundException|  UnknownHostException e){//①}

注意:
1.要捕获的异常类型之间不同属于子类关系才可以。
2.e一旦被赋值就不能在①所在代码块中再赋值,因为异常变量隐含的为final变量。

5.如何选择捕获还是抛出异常呢?
要捕获那些你知道的异常,抛出你不怎样处理的异常。注意,如果父类没有抛出异常,则子类只能捕获异常;子类抛出异常的范围不能大于父类的异常,子类只能更具体。

三、try-with-resources

在Java7版本后加入了此语句,AutoCloseable接口中只有一个方法,void close() throws Exception。如果一个资源是实现了AutoCloseable的类,则该类可以使用try-with-resources语句。

当try块和close同时都出现异常时,close异常将会被抑制且被自动捕获,如果要查看close中被抑制的异常可以通过getSuppressed方法查看异常数组。

publicinterfaceAutoCloseable{voidclose()throws Exception;}

例子:

try(FileInputStream fileInputStream1=newFileInputStream("file.txt")){
    fileInputStream1.read();}catch(IOException e){
    e.printStackTrace();}

在程序执行后try块中的资源就可以自动close。也可以指定多个资源。该语言结构也可以有finally结构,也可以catch和finally都没有。


推荐阅读
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • 本文由编程笔记小编整理,主要介绍了使用Junit和黄瓜进行自动化测试中步骤缺失的问题。文章首先介绍了使用cucumber和Junit创建Runner类的代码,然后详细说明了黄瓜功能中的步骤和Steps类的实现。本文对于需要使用Junit和黄瓜进行自动化测试的开发者具有一定的参考价值。摘要长度:187字。 ... [详细]
  • 1Lock与ReadWriteLock1.1LockpublicinterfaceLock{voidlock();voidlockInterruptibl ... [详细]
  • 本文介绍了利用ARMA模型对平稳非白噪声序列进行建模的步骤及代码实现。首先对观察值序列进行样本自相关系数和样本偏自相关系数的计算,然后根据这些系数的性质选择适当的ARMA模型进行拟合,并估计模型中的位置参数。接着进行模型的有效性检验,如果不通过则重新选择模型再拟合,如果通过则进行模型优化。最后利用拟合模型预测序列的未来走势。文章还介绍了绘制时序图、平稳性检验、白噪声检验、确定ARMA阶数和预测未来走势的代码实现。 ... [详细]
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • Ihavethefollowingonhtml我在html上有以下内容<html><head><scriptsrc..3003_Tes ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • 如何实现JDK版本的切换功能,解决开发环境冲突问题
    本文介绍了在开发过程中遇到JDK版本冲突的情况,以及如何通过修改环境变量实现JDK版本的切换功能,解决开发环境冲突的问题。通过合理的切换环境,可以更好地进行项目开发。同时,提醒读者注意不仅限于1.7和1.8版本的转换,还要适应不同项目和个人开发习惯的需求。 ... [详细]
  • Java如何导入和导出Excel文件的方法和步骤详解
    本文详细介绍了在SpringBoot中使用Java导入和导出Excel文件的方法和步骤,包括添加操作Excel的依赖、自定义注解等。文章还提供了示例代码,并将代码上传至GitHub供访问。 ... [详细]
author-avatar
狮子小刚刚
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有