Java自定义异常的两个要点_Java:异常机制、5个关键字和相关代码、自定义异常及注意事项...

1. Java使用异常的原因及异常处理机制简介

(1)使用异常的原因

如果不用异常会产生的缺陷:

1)容易混淆。如果约定返回值为-9时表示异常,那么当程序最后的计算结果真是-9呢?

2)代码可读性差。将异常处理代码和程序代码混淆在一起将会降低代码的可读性。

3)由调用函数来分析异常,这要求程序对库函数有很深的了解。

而在Java中提供异常处理机制是提供代码健壮的强有力的方式。使用异常机制它能够降低错误处理代码的复杂度。

(2)异常处理机制简介:

Java应用程序中,异常处理机制为:抛出异常,捕获异常。

抛出异常:

当一个方法出现错误引发异常时,方法创建异常对象并交付运行时系统,异常对象中包含了异常类型和异常出现时的程序状态等异常信息。运行时系统负责寻找处置异常的代码并执行。

捕获异常:

在方法抛出异常之后,运行时系统将转为寻找合适的异常处理器。潜在的异常处理器是异常发生时依次存留在调用栈中的方法的集合。当异常处理器所能处理的异常类型与方法抛出的异常类型相符时,即为合适的异常处理器。运行时系统从发生异常的方法开始,依次回查调用栈中的方法,直至找到含有合适异常处理器的方法并执行。当运行时系统遍历调用栈而未找到合适 的异常处理器,则运行时系统终止。同时,意味着Java程序的终止。

2. 异常分类:

(1)异常整体分类:

Java异常结构中定义有Throwable类。Exception和Error为其子类:

1)其中Exception表示由于网络故障、文件损坏、设备错误、用户输入非法情况导致的异常;

2) 而Error标识Java运行时环境出现的错误,例如:JVM内存耗尽。

(2)图形表示如下:

(3)Exception异常分类:

该异常分类:检查异常和非检查异常

1)检查异常:

编译验证,对于声明抛出异常的任何方法,编译期强制执行处理或声明规则,不捕获这个异常,编译期就不通过。

2)非检查异常:

不遵循处理或者声明规则。在产生此类异常是,不一定非要采取任何适当的操作,编译器不检查是否已经解决了这个异常。

检查异常举例:

非检查异常举例:

3. 异常的常用方法:

4. 异常捕获:try、catch、finally关键字

(1)关键字解释:

1) try{…}语句:

指定了一段代码,该段代码就是一次捕获并处理例外的范围。

2) catch语句:

(1)在执行过程中,该段代码可能会产生并抛出一种或几种类型的异常对象,它后面的catch语句分别对这些异常做相应的处理。如果没有异常发生catch代码被略过不执行。

(2)多个try-catch捕获的异常类型由上至下顺序为子类到父类。

3)finally语句:

(1)为异常处理提供一个统一的出口,使得在控制流转到程序其他部分之前,能够对程序的状态做统一的管理。

(2)无论try块中是否抛出异常,finally块都会被执行。

(3)可以在finally块中释放资源:文件、数据库连接、网络连接。

(2)以上三个关键字应用语法:

try{

// 程序代码

}catch(异常类型1 异常的变量名1){

// 程序代码

}catch(异常类型2 异常的变量名2){

// 程序代码

}finally{

// 程序代码

}

(3)try、catch、finally语句块的执行顺序:

1)当try没有捕获到异常时:try语句块中的语句逐一被执行,程序将跳过catch语句块,执行finally语句块和其后的语句;

2)当try捕获到异常,catch语句块里没有处理此异常的情况:当try语句块里的某条语句出现异常时,而没有处理此异常的catch语句块时,此异常将会抛给JVM处理,finally语句块里的语句还是会被执行,但finally语句块后的语句不会被执行;

3)当try捕获到异常,catch语句块里有处理此异常的情况:在try语句块中是按照顺序来执行的,当执行到某一条语句出现异常时,程序将跳到catch语句块,并与catch语句块逐一匹配,找到与之对应的处理程序,其他的catch语句块将不会被执行,而try语句块中,出现异常之后的语句也不会被执行,catch语句块执行完后,执行finally语句块里的语句,最后执行finally语句块后的语句;

(4)代码实例:

5. 异常抛出:throws/throw关键字

如果一个方法没有捕获一个检查性异常,那么该方法必须使用 throws 关键字来声明。throws 关键字放在方法签名的尾部。

(1)关键字具体解释:

throw

位置是在方法内

程序发生异常而无法处理时,会抛出对应的异常对象,除此之外,在某些时刻,您可能会想要自行抛出异常。

例如:在处理异常结束后,想将异常抛出,让下一层异常处理块来捕捉。

throws

位置是在方法签名处声明

继承时需要重写

继承的子类可以不处理异常,仅抛出父类声明的异常;但是不可以抛出额外的异常

(2)throw关键字代码实例:

(3)throws关键字代码实例:

6. 自定义异常

虽然Java类库已经提供了很多可以直接处理异常的类,但有时候为更加精确的捕获和处理异常以呈现更好的用户体验,需要开发者自定义异常。但是,自定义异常需要继承Exception。

代码实例:

7. 异常使用的注意事项:

1)当子类重写父类的带有 throws声明的函数时,其throws声明的异常必须在父类异常的可控范围内。

例如,父类方法throws 的是2个异常,子类就不能throws 3个及以上的异常。父类throws IOException,子类就必须throws IOException或者IOException的子类。

2) Java程序可能是多线程的。每一个线程都是一个独立的执行流,独立的函数调用栈。那么,Java中的异常是线程独立的,线程的问题应该由线程自己来解决,而不要委托到外部,也不会直接影响到其它线程的执行。

3)不要在fianlly中使用return。

4)不要在finally中抛出异常。

5)减轻finally的任务,不要在finally中做一些其它的事情,finally块仅仅用来释放资源是最合适的。

6)将尽量将所有的return写在函数的最后面,而不是try … catch … finally中。

感觉这篇文章有用的话,就帮助收藏和转发文章吧。这样会帮助我们在该企鹅号发表更多的优质文章。

同时,也欢迎大家关注该企鹅号!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值