对课上问题的探究和思考--异常处理

问题一:课堂小测试

天知道一上来就要进行小测试的崩溃啊,但是当我看到题目的时候,长长地舒了一口气,题目附上:

就是一个输入加上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块中捕获多个异常

问题二十:自定义异常与异常处理链

实例:

结果:

问题二十一:异常处理的建议

posted @ 2022-10-15 10:43  yesyes1  阅读(23)  评论(0编辑  收藏  举报