Java基础知识整理19(异常处理)

异常处理:
Java异常机制主要依赖try,catch,finally,throw和throws五个关键字,其中try关键字后紧跟一个花括号括起来的代码块,简称try块,它里面放置可能引发异常的代码。Catch后对应异常类和一个代码块,用于表明该catch块用于处理这种类型的代码块,多个catch块后还可以跟一个finally块,finally块用于回收在try块里打开的物理资源,异常机制会保证finally块总被执行。Throws关键字主要在方法签名中使用,用于声明该方法可能抛出异常,而throw用于抛出一个实际异常,throw可以单独作为语句使用,抛出一个具体异常的对象。
Java将异常分为两种:Checked异常和Runtime异常,Cheched异常都是可以在编译阶段被处理的异常,所以强制程序处理的所有的checked异常,而Runtime异常则无需处理。
异常处理机制:当程序运行出现意外时,系统会自动生成一个Exception对象来通知程序,从而实现将“业务功能实现代码”和“错误处理代码”分离,提供更好的耳毒性。
使用try。。。catch 捕获异常:
Try{
//业务实现代码
。。。
}
Catch(Exception e)
{
Alsert输入不合法
Goto retry;
}
如果执行try块里的业务逻辑代码时出现异常,系统会自动生成一个异常对象,该异常对象被提交给java 运行时环境,这个过程叫抛出异常。
当Java运行时环境收到异常对象时,会寻找能处理该异常对象的catch块,如果找到合适的catch块并把该异常对象交给Catch处理,这个过程称为捕获异常。如果Java运行时环境找不到捕获异常的catch块,则运行时环境终止,Java程序也将退出。
异常的继承体系:
在这里插入图片描述
通常情况下,如果try执行一次,则try块后只有一个catch块会被执行,绝不可能有多个catch块被执行,除非在循环中使用continue开始下一次循环,下一次循环又重新远行了try块,这才导致多个catch块被执行。
Try块里声明的变量是代码块内局部变量,他只在try块内有效,catch块中不能访问该变量。
在这里插入图片描述
Java把所有非正常情况分成两种:异常和错误,他们都是继承Throwable父类
Error一般指虚拟机相关问题这种错误无法恢复或不可能捕获,将导致应用程序中断。通常应用程序无法处理这些错误,因此应用 程序不应该使用catch来捕获Error对象。
Java运行时的异常处理逻辑可能有如下几种情况:
如果运行该程序时输入的参数 不够,将会发生数组越界异常,Java运行时使用IndexOutOfBoundsException对应的catch块处理异常。
如果运行该程序输入的参数不是数字,而是字母,经发生数字格式异常,Java运行时将调用NumberFormatExcepion对应的catch块处理该异常。
如果运行该程序输入的第二个参数是0,将发生除0异常,Java运行时将调用ArithmeticException对应的catch块处理该异常。
如果程序运行时出现其他异常,该异常对象总是Exception类或其子类的实例,Java运行时将调用Exception对应的catch块处理该异常。

先处理小异常,再处理大异常。
访问异常信息:
所有异常对象都包含几个常用的方法:
getMessage():返回该异常的详细描述字符串
printStackTrace():将该异常的跟踪栈信息输出到指定的输出流
printStackTrace(PrintStream s);将该异常的跟踪栈信息输出到制定的输出流
getStackTrace():返回该异常的跟踪栈信息
使用finally回收资源:
Java的垃圾回收机制不会回收任何物理资源,垃圾回收机制只能回收堆内存中对象所占用的内存
不管try块中代码是否出现异常,也不管哪一个catch块被执行,finally块总会被执行。
除非在try块,catch块中调用了退出虚拟机的方法,否则不管在try块,catch块中执行怎样的代码,出现怎样的状况,异常处理的finally块总会被执行
不要在finally中使用如return或throw等导致方法终止的语句,一旦在finally块中使用了return或throw语句,将会导致try块,catch块中的return,throw语句失败。
当Java程序执行了try块,catch块时遇到了return语句或throw语句,这两个语句都会导致该方法立即结束,但是系统并不会立即执行这两个语句,而是去寻找该异常处理流程中是否包含finally块,如果没有,程序立即执行return或throw语句,方法终止,如果有finally块,系统执行finally块,只有当finally块执行完成后,系统才会再次跳回来执行try块,catch块里的return或throw语句,如果finally中有return或throw等导致方法终止的语句,则finally块已经终止了方法,系统不会再跳回去执行try块,catch块里的任何代码。
异常处理的嵌套:
在try块,catch块或finally块中包含完整的异常处理流程的情形被称为异常处理嵌套。
Checked异常和Runtime异常体系:
Java异常被分为两大类:checked异常和Runtime异常(运行时异常)。所有RuntimeException类及其子类的实例被称为Runtime异常,不是所有RuntimeException类及其子类的实例被称为Checked异常。
只有Java提供了Checked异常。Checked异常体现了Java设计哲学:没有完善错误处理的代码根本就不会被执行!
对于Checked异常处理的方式有两种:
1.当前方法明确知道如何处理该异常,程序应该使用try…catch块来捕获该异常,然后在对应的catch块中修补该异常。
2.当方法不知道如何处理这种异常,应该在定义该方法时声明抛出该异常。
使用throws声明抛出异常:
思路:当前方法不知道应该如何处理这种类型的异常,该异常应该由上一级调用者处理,如果main方法也不知道如何处理这种类型的异常,也可以使用throws声明抛出异常,该异常交给JVM处理。JVM处理异常的方法是:打印异常栈跟踪信息,并中止程序运行。
Throws只能在方法签名中使用,抛出多个异常类时,多个异常类之间以逗号隔开。一旦使用了throws语句声明抛出异常,就无需使用try…catch块来捕获异常。
使用throws声明抛出异常时有一个限制:就是方法重写时的“两小”中一条规则:子类方法中声明抛出的异常类型应该是父类方法声明抛出的异常类型子类或相同,子类方法中不允许比父类方法声明抛出更多异常。
使用throw抛出异常:
如果在程序中自行抛出异常,应使用throw语句,throw可以单独使用,throw语句不是一个异常类,而是一个异常实例,而每次只能抛出一个异常实例,格式:
Throw ExceptionInstanc;
如果throw语句抛出的是Checked异常,则该throw语句要么放在try里,显示捕捉该异常,要么放在一个带throws声明抛出的方法中,吧异常交给方法调用这处理。如果是Runtime,可以完全不理会该异常。
自定义异常类:
用户自定义异常都应该继承Exception基类,如果希望自定义Runtime异常,则应该继承RuntimeException基类,定义异常类时通常需要提供两种构造器:一个是无参的,一个是带字符串参数的构造器,这个字符串将作为该异常对象的详细说明。
在这里插入图片描述
Catch和throw同时使用:
异常处理方式有两种:
1. 在出现异常的方法内捕获并处理异常,该方法的调用者将不能再次捕获该异常
2. 该方法签名中声明抛出异常,将该异常完全交给方法调用者处理。

当一个异常出现时,单靠某个方法无法完全处理该异常,必须由几个方法协作才可以完全处理,该异常出现的当前方法中,程序只对异常进行部分处理,还有些处理需要在该方法的调用者中才能完成,所以应该再次抛出异常,这样就可以让该方法的调用者也能捕获到该异常。
在这里插入图片描述
这种catch和throw结合的使用情况在企业应用非常用,对异常处理分为两部分:1 ,应用后台需要通过日志来记录异常发生的详细情况;2,应用还需要根据异常向应用者传达某种提示。在这种情况下,所有异常都需要两个方法共同完成。即将catch和throw结合使用。
异常链:
在这里插入图片描述
当业务逻辑访层访问持久层出现SQLException异常时,程序不应该把底层的SQLException,传到用户界面,原因有两个:
1. 对于正常用户而言,他们不想看到底层SQLException,SQLException对他们使用该系统没有任何帮助。
2. 对于恶意用户而言,将SQLException暴露出来不安全。
通常使用异常转译。
把捕获一个异常然后接着抛出另一个异常,并把原始异常的信息保存下来的是一种典型的链式处理,也被称为异常链。
Java异常跟踪栈:
在这里插入图片描述
异常处理机制:
成功的异常处理应该达到如下四个目标:
1. 使程序代码混乱最小化
2. 捕捉并保留诊断信息
3. 通知合适的人员
4. 采用合适的方式结束异常活动
不要过度使用异常:
过度使用异常由两个方面:
1. 把异常和普通错误混淆在一起,不再编写任何错误处理代码,而是简单的抛出异常来代替所有错误处理。
2. 使用有一场处理来代替流程控制。
异常处理机制的初衷是将不可预期异常的处理代码和正常业务逻辑处理代码分离,因此绝对不要使用异常处理来代替正常的业务逻辑判断。
不要使用过于庞大的try块。
避免使用Catch All语句
不要忽略捕捉到的异常。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值