对课上问题的探究和思考--异常处理
问题一:课堂小测试
天知道一上来就要进行小测试的崩溃啊,但是当我看到题目的时候,长长地舒了一口气,题目附上:
就是一个输入加上if语句的判断奥,是不是挺简单的,但是,王老师怎么可能会让我们这么简单地过呢?后来直接提出问题,要求互换程序,搞崩溃即可。当我信心满满地输入整数的时候,没报错的,只是一个a就让我的程序崩盘。嗯,实践性果然很强!
王老师借此,向我们强调了程序健壮性的重要性,程序质量不在繁琐和高深,而在于其是否健壮
问题二:进入正题,异常处理
异常(Exception):在遇到非法的运行状况时,会抛出一个异常对象
目的:异常处理的目的是:为了使得程序能够更好地、更加健壮地运行;提供错误信息,让我们能够更加方便地找到错误,并解决错误,从而提高程序的健壮性,让程序能够继续运行。
实例:AboutException.java
运行之后,他会抛出这样一个异常:
表示:0不能作为除数
问题三:Java异常运行机制
而在Java中,有这样一个机制:
需要注意到的是:Java 中所有可捕获的异常都派生自 Exception 类
就如上图所示,需要将可能会发生错误的代码放置到try代码块里面,
catch代码块用于处理错误,
而finally代码块中的代码一定会被执行,一般用来存储不论对错,都需要执行的代码
我们了解到,Java程序其实是依靠着JVM虚拟机完成的,无论放在什么操作系统里面,他就像一块飞毯,与操作系统间总有一定的距离,而C语言不会存在这样的问题,它总是能与各种操作系统相配,故而,C语言的运行效率比Java要高。
问题四:相关的错误类型汇总
其中Exception错误是可控的,主要是由于代码问题而引起的错误;
而Error错误就需要去看看系统问题了;
目前,我们正在学习并实践Javaweb的相关知识,在过程中,总是会报出404和500的错误,二者有时还会交替出现,“惊喜不断”呢!
404和500的错误主要是这种错误:
(放心啦,避免不了的,我们都会经历的)
问题五:异常的分类
Throwable--1、Exception----------2、Error
Exception中出现的异常是可以被捕获的,而Error中出现的异常:是由于系统错误,通常由JVN处理
可捕获的异常又可以进行分类--1、Check异常----------2、Runtime异常
例如:均可以通过throw进行抛出操作----------
问题六:AssertionError处理
这种错误属于我们自己给自己写了一个错误,(相当于自己给自己找麻烦的那种)
其实我不是很理解这种错误存在的意义,用boolean或者条件判断是否正确不香嘛?
当然,要使用的话,我也是很支持的,下面是打开方式:
问题七:OOM Error
简称“内存溢出”,虽然发生的几率很小,但一旦发生就是致命的、不可挽回的错误,还是要引起重视的!!!
在不再使用程序的时候,一定要记得关闭啊,避免因为某些环境下强制结束使用而引发出来OOM Error的错误!
问题八:奇怪的现象
为什么同样是0作为除数,int类型的数据会报错,但是float类型的数据不会报错呢?
对于浮点数来说,有一个特殊规定,要求在其除以0时,会有NaN或者Infinity的显示(无穷大的显示),而在int类型里面并没有这个规定,只能依靠JVM进行处理
问题九:异常的“多态”特性
catch代码块不要放错位置了奥,不然这本身就又是一个错误了!
问题十:对finally的探讨
finally语句块主要用于解决资源泄露问题
位于catch代码块之后,保证JVM一定被执行
需要注意到的是,finally代码块也有可能发生异常,如果这种情况发生,那么先前的异常被放弃
问题十一:自动释放的资源
问题十二:多层的异常捕获
实例1:
结果1:
实例2:
结果2:
发现,首先抛出的是那个对象的异常,就会执行哪个对象的捕获语句
问题十三:多个try、catch、finally存在时,需要注意到finally的执行时机
实例:
总结:发现try代码块里面的代码是按照顺序执行,而在通过catch代码块解决异常之后,之后的catch代码块里面的语句都不会再执行,而finally代码块里面的代码会按照顺序执行出来
问题十四:finally代码块里面的代码都会被执行嘛?
实例:
结果:
发现:要是在try代码块里面直接进行异常的抛出操作,那么之后的catch语句和finally语句均不会被执行
问题十五:如何跟踪异常的传播路径?
实例:
结果:
总结:Java多层嵌套异常处理的基本流程
try-->catch-->finall;
其中,主要是按照顺序进行的,如果在try中直接选择抛出异常,那么catch和finally均会失效;
抛出异常的对象不同,在多个try语句中,也会根据对象而执行不同的语句;
问题十六:受控异常
有可能有特殊情况,比如文件可能找不到等情况;
在完全符合代码规范的程序中,如果无法通过编译,那么有可能是需要进行某些异常的抛出,即受控异常
throws语句就能够较好地解决这隐藏问题;
当一个方法包含throws子句时,需要在调用此方法的代码中使用try/catch/finally进行捕获,或者是重新对其进行声明,否则编译时报错
throws语句直接派生于Exception类,成为受控异常
而RuntimeException和Error不能由throws声明,成为非受控异常
实例+结果:
问题十七:一个方法可以抛出多个受控异常
Java的独特之处:
实例:
结果:
问题十八:子类抛出受控异常的限制
实例:
结果:
需要明白的是:
问题十九:Java7之后,允许在一个catch块中捕获多个异常
问题二十:自定义异常与异常处理链
实例:
结果: