第九周动手动脑01
运行AboutException.java示例,然后通过后面的几页PPT了解Java中实现异常处理的基础知识。
运行结果:
Java中的异常捕获语句
Try{
//可能发生运行错误的代码;
}
catch(异常类型 异常对象引用){
//用于处理异常的代码
}
finally{
//用于“善后” 的代码
}
把可能会发生错误的代码放进try语句块中。
当程序检测到出现了一个错误时会抛出一个异常对象。异常处理代码会捕获并处理这个错误。
catch语句块中的代码用于处理错误。
当异常发生时,程序控制流程由try语句块跳转到catch语句块。
不管是否有异常发生,finally语句块中的语句始终保证被执行。
如果没有提供合适的异常处理代码,JVM将会结束掉整个应用程序。
Java中的异常分类
Throwable类有两个直接子类:
Exception:出现的问题是可以被捕获的;
Error:系统错误,通常由JVM处理。
可捕获的异常又可以分为两类:
(1)Check异常:直接派生自Exception的异常类,必须被捕获或再次声明抛出
(2)Runtime异常:派生自RuntimeException的异常类。使用throw语句可以随时抛出这种异常对象:
throw new ArithmeticException(…);
请尝试解释以下奇怪的现象!
前页PPT中所出现之奇怪现象,可以使用javap去反汇编两个示例程序的.class文件(一个是AboutException.class,另一个是ThrowDemo.class),从中你会有所发现的。
“finally”的功用
资源泄露:当一个资源不再被某应用程序使用,但此程序并未向系统声明不再使用此资源时发生这种情况
finally语句块主要用于解决资源泄露问题,它位于catch语句块之后,JVM保证它们一定执行。
注意:finally语句块中也可能发生异常,如果这种情况发生,先前的异常被放弃。
阅读以下代码(CatchWho.java),写出程序运行结果:
结果:
写出CatchWho2.java程序运行的结果
结果:
当有多个嵌套的try…catch…finally时,要特别注意finally的执行时机。
请先阅读 EmbedFinally.java示例,再运行它,观察其输出并进行总结。
特别注意:
当有多层嵌套的finally时,异常在不同的层次抛出 ,在不同的位置抛出,可能会导致不同的finally语句块执行顺序。
结果:
辨析:finally语句块一定会执行吗?
请通过 SystemExitAndFinally.java示例程序回答上述问题
不会,如果在catch语句,或者try语句中执行了System.exit(0)语句则直接退出程序
当程序中出现异常时,JVM会依据方法调用顺序依次查找有关的错误处理程序。
可使用printStackTrace 和 getMessage方法了解异常发生的情况:
printStackTrace:打印方法调用堆栈。
每个Throwable类的对象都有一个getMessage方法,它返回一个字串,这个字串是在Exception构造函数中传入的,通常让这一字串包含特定异常的相关信息。
异常的总结:
java异常分为异常和错误,Exception和Error,两个类,者这两个类都继承自Throwable类,Throwable是所有java异常的根。
java所有的异常类包括Throwable,Exception,Error都是类,所以都是可以实例化的(笔试经常会遇到)
Error:不能被程序很好处理的错误(cannot be handled reasonably by program)
机器的内存不够了
JVM崩溃了(是程序都有可能挂掉)
线程挂掉了
…
Exception:可以被程序处理的(can be handled by program)
IO错误(键盘,磁盘)
网络错误
不合法的类型转换
数组或者容器越界
java的异常一般会分为运行时异常和非运行时异常
运行时异常就是RunTimeException的所有子类
非运行时异常就是Exception的其他所有孩子类,比如IOException,InterruptedException
Java中关于异常的类主要在java.lang.*;和java.io.*;中