资讯专栏INFORMATION COLUMN

Java 异常处理相关

番茄西红柿 / 3269人阅读

摘要:相关类的结构如下所示类类是语言中所有错误和异常的超类,只有当一个对象直接或者间接的是此类的实例时,才能通过语句抛出异常,同样,只有这种类才能被语句捕获进行处理类的子类是错误,不是程序可以处理的,一般会是内存不足,线程终止,虚拟机运行错误等,

相关类的结构如下所示

java.lang.Object

java.lang.Throwable

java.lang.Error

java.lang.Exception

java.lang.RuntimeException

Throwable类

Throwable 类是Java语言中所有错误和异常的超类,只有当一个对象直接或者间接的是此类的实例时,Java才能通过throw语句抛出异常,同样,只有这种类才能被try……catch语句捕获进行处理

Throwable类的子类Error是错误,不是程序可以处理的,一般会是内存不足,线程终止,Java虚拟机运行错误等,只能听之任之,JVM通常会kill掉这个进程

Throwable类的子类Exception是异常,是程序可以处理的,进一步分为CheckedException 和 UncheckedException

CheckedException发生在编译阶段,代码语句必须使用try……catch或者throws,否则无法进行编译,比如StreamTokenizer必须声明抛出异常IOException,除了Runtime Exception类集之外,其他的Exception类集都是CheckeException

UncheckedException发生在程序的运行阶段,一般来说具有不确定性,不容易定位和DEBUG

Exception类

该类指出了合理的应用程序想要捕获的异常条件,有两个参数,默认构造可以是两个可选参数,一个是详细信息,一个是异常原因,分别对应下述四个构造方法,分别于super对应

public Exception()

public Exception(String message)

public Exception(String message, Throwable cause)

public Exception(Throwable cause)

RuntimeException类

RuntimeException是那些在Java 虚拟机正常运行期间抛出的异常的超类,属于uncheckedException,比如说发生数组越界,空指针等逻辑引起的问题

可能在执行方法期间抛出,但是没有被捕获的RuntimeException的任何子类都不用在throws子句中声明

包含四个构造方法

RuntimeException()

RuntimeException(String message)

RuntimeException(String message, Throwable cause)

RuntimeException(Throwable cause)

try - catch - finally

在try代码片段中,包含着有可能抛出异常的语句,如果无异常,则直接跳到finally代码块,否则相应的捕获异常,执行catch代码块的内容

无论是否try代码块发生异常,finally都会被执行,可以在这里进行一些接口的close操作等

如果代码中显式的声明了某一个异常类型,则异常处理机制不会显示这个异常是在哪里抛出的,如果是没有声明异常遭遇中断,异常处理会显示出处

每一个catch按照书写的先后依次匹配执行,一旦亦常被某一个catch捕获,则必不会被其他的catch捕获处理

当try代码块或者catch代码块中包括return语句的时候,finally代码块将会在return之前被强制执行,finally不被执行仅仅当下列条件被满足:

代码在finally代码块之前即发生错误

代码在finally代码块之前进行了System.exit()

当前线程由于某种情况丢失

关机,或者各种奇葩的可能条件

throw 和 throws

throws 是方法抛出异常的声明,表示一个预动作,说明下方方法可能会抛出异常,throws不做其他处理,仅仅是上交异常到调用,方法中抛出的任何异常都必须有throws声明,除非是将交由运行时系统自动抛出的RuntimeException

throw是抛出异常,是一个明确的动作,必须与try……catch或者throws一起使用,抛出的只能是Throwable的类集中的类,如果所有的方法都将异常往上层调用者抛,那么JVM最后的处理就是打印异常消息和堆栈信息

自定义异常类型

一般来说,套路如下:

定义一个类,继承自Throwable或者某一个子类

构造方法,或者直接使用super的构造方法

throws声明,在代码块的某处throw该异常类

catch到抛出的异常进行处理

异常链机制

当异常较少的时候,我们可以对每一个异常进行try 和catch, 但是如果出现多个异常,显然通过一个Exception处理所有异常的方式会增加维护代码DEBUG的困难度,所以我们需要将异常信息进行封装,然后捕获我们的异常封装类即可

异常的处理方式有两种,一种是throws抛出异常后交给上级去处理,另一种就是使用try和catch进行具体的修正处理,异常链的处理采用第一种方式,在try ……catch的catch代码块中不做任何处理,唯一的动作就是抛出封装好的异常信息,然后会有throws抛出该异常,递归的每一层都如此控制异常抛出,就形成了一条异常链

如果我们想要在捕获到一个异常后抛出另外一个异常,那么,我们可以调用Throwable类集的getCause()方法,得到类中的cause参数,这个参数保存的就是原始存有的异常信息,也就是说cause是导致抛出该throwable的throwable

保留有异常链的catch代码块中可以使用Throwable的printStackTrace()方法来打印整个异常信息

getCause() 返回由一个需要Throwable的构造方法提供的cause,或者是在创建Throwable之后通过initCause()来设定cause,子类不必要重写,也不必重写printStackTrace()

printStackTrace()方法会将对象的堆栈跟踪输出到输出流,作为System.err的值

几个建议

尽量在try中不要包含太多的代码,缩小异常范围圈

如果有的接口即使有异常也照样要运行,那么应该使用finally

缩小catch捕获的异常,尽量使catch捕获明确的单个异常

抛出异常的时候,尽量包含易读易懂的描述和名称

不在构造函数中抛出异常,不在finally代码块中处理返回

不要老抛出异常,会降低Java的效率和系统的性能

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/72367.html

相关文章

  • Java 异常实战

    摘要:不过按照经验来说,这类异常要么尽量避免,要么出现了就要做异常处理,从而保证程序的健壮性。业务是千变万化,但是它们可能产生的异常处理方式是不会变化的,按照这个思路去做异常处理即可。 前言:说到异常体系,可能对于一些初入职场的老铁会很头痛,不能够很清晰的描述异常是个什么情况。那么本文将通过打流水仗的方式给大家介绍一下工作中涉及的异常知识。首先能看到本文,说明也对异常是有了解的,所以文章开头...

    libxd 评论0 收藏0
  • Java新手的一些建议——Java知识点归纳(Java基础部分)

    摘要:中很多特性或者说知识点都是和面向对象编程概念相关的。在多线程中内容有很多,只是简单说明一下中初步使用多线程需要掌握的知识点,以后有机会单独再详细介绍一些高级特性的使用场景。   写这篇文章的目的是想总结一下自己这么多年来使用java的一些心得体会,主要是和一些java基础知识点相关的,所以也希望能分享给刚刚入门的Java程序员和打算入Java开发这个行当的准新手们,希望可以给大家一些经...

    lykops 评论0 收藏0
  • Java程序设计笔记

    摘要:对象的自动清除对象回收是由垃圾回收线程负责方法可以要求系统进行垃圾回收,仅仅是建议系统没有析构方法,但的有类似方法系统在回收时会自动调用对象的方法子类的方法可以在里面释放系统资源,一般来说,子类的方法中应该调用父类的方法。 对象的自动清除 对象回收是由垃圾回收线程负责 System.gc()方法可以要求系统进行垃圾回收,仅仅是建议系统 java没有析构方法,但Object的final...

    microcosm1994 评论0 收藏0
  • java异常处理

    摘要:异常处理机制异常与异常类的继承体系在程序中,当程序出现意外情况时,系统会自动生成一个来通知程序,从异常发生出逐渐向外传播,如果没有人来处理该异常,就会交给来处理,对异常的处理方法是,打印异常跟踪栈信息,并中止程序的执行。 1 为什么要处理异常? 异常机制可以使程序的异常处理代码与正常业务代码分离,保证程序代码的健壮性。在设计程序的时候,好的程序需要尽可能处理已知的可能产生的错误,但是事...

    LuDongWei 评论0 收藏0
  • java异常的设计和使用

    摘要:异常处理作用调试程序定位缺陷。对异常的处理是系统容错可靠性的一环。抛出需要具体子异常捕获同时也需要具体子异常不同子异常处理会不同。如有基础基类异常调用者可以选择使用这个基类该类下面的所有子异常使用统一处理也可以单独对子异常处理。 showImg(https://segmentfault.com/img/bVbrm5g); 1 背景 1年前的文章,源于Sonar静态代码扫描中,项目历史代...

    sshe 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<