java之异常

1. 顶级错误类Throwable

其子类有:

1. Error : 指的是在程序因为设计问题导致程序崩溃错误,如内存泄漏等,这里暂不考虑这种错误

2. Exception :指的是在程序中正常情况下运行时没有任何问题,但在一些特定情况下会出现一些异常情况,如:数组越界、空指针等,其又分为两种异常(这里主要讨论Exception)。

    * 运行时异常(非检查型异常):指在运行过程中,程序出现的错误,如:数组越界。

    * 非运行时异常(检查型异常):程序设计时,可能会遇到的一些错误,如:io读取异常,文件不存在等,需要提前进行检查处理

2. 异常的处理策略

异常 --> 在堆上创建一个异常对象  --> 返回引用 --> 在合适的地方处理(可以是自行catch或者向上抛出,交给java虚拟机进行处理)

java中提供了try..catch语句块,及throw/throws关键字,getStackTrace()方法,异常链,finally代码块

异常产生就是所需数据无法正确的得到,所以设计异常之初有两种处理的考虑:

1. 当程序出现异常时,将异常获取到,对出现异常进行处理,使其能够恢复到正常情况继续运行,所付出的代价是需要进行不断的循环处理,使异常代码能够得到正确的数据,但由于花费代价太高,每种异常情况都要去考虑设计,开销太大,只好放弃

2. 将程序出现异常处进行捕获/抛出,使程序运行终止

2.1 try...catch语句块用法

为了使异常处理代码与正常逻辑代码分离,在try块中编写正常代码,在catch中进行异常处理

try中出现异常后的代码无法执行,得到中断,进行catch处理后,代码块外的代码得到执行....

2.2 throw/throws用法

当出现异常时,可以将异常向上抛出,最终由上层代码进行捕获处理


2.3 Exception中的getStackTrace方法

这个方法会得到执行线程栈中的所有栈帧,(栈帧就是没调用一个方法,就会向栈中压入一个栈帧其中包括执行的方法,返回值,形参等),可将其遍历,得到程序执行的调用结果



只截取了部分结果,最先执行的方法,最后打印,栈是先进后出

2.4 异常链

使用多层catch进行异常捕获,子类在父类前进行捕获,否则会被父类异常所覆盖


若将异常捕获后,重新创建一个异常进行抛出,会将之前的异常信息所覆盖,这时,可以使用Exception中的initCause方法将之前的异常信息保存延续下去



正常得出异常所产生的位置,如果没有使用initCause方法的话,异常的产生就会在第90行而不是85行

2.5. finally块

在try...catch块后面还可以跟一个finally语句块,其作用为:无论是否异常都会在代码块结束执行前执行finally代码块中的代码(所以常用来对资源进行释放)

3. 自定义异常

自定义异常可以通过继承Exception类进行创建,默认有两个构造参数,一个无参和一个带有string信息的有参构造


这样就实现了一个自定义异常类,如需添加一些信息记录,可自行设置

注意:如果自定义异常继承的是Exception类,没有指定明确类型的异常如RunTimeException等,在代码块中执行方法等未抛出自定义异常是不能通过编译的,如:



如果自定义异常指定了类型,就不会出现问题



如有错误,欢迎指正。

参考自:thinking in java

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值