JAVA自学笔记,捕捉处理异常

之前博文中说道非运行时异常时,提到了系统会自动为非运行时异常提供两种解决方案,一种是使用throws关键字,一种是使用try…catch代码块,这两种方法都是用来对异常进行处理的。我们先对try…catch代码块进行讲解。
try…catch代码块主要用来对异常进行捕捉并处理。在实际使用时,该代码块还有一个可选的finally代码块,其标准语法如下。

try{
	//程序代码块
}catch(Exceptiontype e){
	//对Exceptiontype的处理
}finally{
	//代码块
}

其中,try代码块中使可能发生异常的Java代码。catch代码块在try代码块之后,用来激发被捕捉的异常。finally代码块是异常处理结构的最后执行部分,无论程序是否发生异常,finally代码块中的代码都将被执行,因此,在finally代码块中通常放置一些释放资源,关闭对象的代码。
通过try…catch代码块的语法可知,捕捉处理异常分为try…catch代码块和finally代码块两部分。下面分别进行讲解。

try…catch代码块

看例子。
在这里插入图片描述
在这里插入图片描述
从本例中可以看出,程序仍然输出最后的提示信息,没有因为异常而终止。当try代码块中的语句发生异常时,程序就会跳转到catch代码块中执行,执行完catch代码块中的程序代码后,将继续执行catch代码块后的其他代码,而不会执行try代码块中发生异常语句后面的代码。由此可知,Java的异常处理是结构化的,不会因为一个异常影响整个程序的执行。
上面代码中,在catch代码块中使用了Exception对象的printStackTrace()方法输出了异常的栈日志,除此之外,Exception对象还提供了其他的方法用于获取异常的相关信息。
1,getMessage方法:获取有关于异常事件的信息。
2,toString方法,获取异常的类型与性质。
3,printStackTrace方法:获取异常事件发生时执行堆栈的内容。
有时为了编程简单会忽略catch代码块后面的代码,这样try…catch语句就成了一种摆设,一旦程序在运行过程中出现了异常,就会导致最终运行结果与期望的不一致,而错误发生的原因很难查找,因此要养成良好的编程习惯,最好在catch代码块中写入处理异常的代码。
在本例中,虽然try代码块后面用了一个catch代码块来捕捉异常,但是遇到需要处理多种异常信息的情况时,可以在一个try代码块后面跟多个catch代码块。这里需要注意的是,如果使用了多个catch代码块,则catch代码块中的异常类顺序是先子类后父类,因为父类的引用可以引用子类的对象。我们修改一下之前的一个例子。
在这里插入图片描述
这时如果将这两个catch代码块的位置互换。
在这里插入图片描述
这时编译器会出现如上图所示的错误提示,该错误就是由于使用多个catch代码块时,父异常类放在了子异常类前面所引起的。因为Exception是所有异常类的父类,如果将catch(Exception e)代码块放在catch(NumberFormatException e)的前面,后面的代码块将永远得不到执行,也就没有什么意义了,所以catch代码块的顺序不可调换。

finally代码块

完整的异常处理语句应该包含finally代码块,通常情况下,无论程序中有无异常发生,finally代码块中的代码都可以正常执行。我们可以修改一下上面的例子,将程序结束的提示信息放到finally代码块中。
在这里插入图片描述
在这里插入图片描述
从这里可以看出,程序在捕捉完异常信息之后,会执行finally代码中的代码。另外,在以下三种特殊情况下,finally块不会被执行
1,在finally代码块中发生了异常。
2,在前面的代码中使用了System.exit()退出程序
3,程序所在的线程死亡。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值