11.1 处理错误
所有的异常都是由Throwable类继承而来,分为Error和Exception两个分支.
Error类层次结构描述了Java运行时系统的内部错误和资源耗尽错误.如果出现这样的内部错误,除了通知用户,并尽力使程序安全地终止之外,再也无能为力了.
在进行Java程序设计的时候,需要关注Exception层次结构,这个层次结构又分解为两个分支:一个分支是派生RuntimeException,另一个分支包含其他异常.划分两个分支的规则是:由程序错误导致的异常属于RuntimeException,曾经能够正确运行,而由于某些情况(例如IO错误)导致的异常不属于RuntimeException.
派生于RuntimeException的异常包含下面几种情况:
错误的类型转换
数组访问越界
访问空指针
“如果出现RuntimeException异常,就一定是你的问题”是一条相关有道理的规则.
Java语言规范将派生于RuntimeException类或Error类的所有异常称为“未检查(unchecked)异常”,其他的异常称为“已检查(checked)异常”.
如果一个方法有可能抛出多个已检查异常,就必须在方法的首部列出所有的异常类,每个异常类之间用逗号隔开.但是,不需要声明Java的内部错误,即从Error类继承的那些异常.任何程序代码都具有抛出这类异常的潜能,而我们对此却没有任何控制能力.同样,也不应该声明从RuntimeExceptioon继承来的那些未检查异常.
11.2 捕获异常
如果调用一个抛出已检查异常的方法,就必须对它进行处理,或者将它传递出去.通常,应该捕获那些知道如何处理的异常,而将不知道如何处理的异常传递出去.
不允许在子类的throws说明符中出现超过超类方法所列出的异常类范围.
当finally子句包含return语句时,会出现一种意想不到的结果,假设利用return语句从try语句快中退出,在方法返回之前,finally语句块的内容将会被执行.如果finally语句块中也包含一个return语句,那么这个返回值将会掩盖原始的返回值.
11.5 使用断言
在JDK 1.4中,Java语言引入了新关键字assert.在默认情况下,断言是禁用的,可以在运行程序时用-enableassertions或-ea选项启用它:java -enableassertions MyApp.
需要注意的是,在启用或禁用断言时不必重新编译程序.启用或禁用断言是类加载器的功能,当断言被禁用时,类加载器将跳过断言代码.也可以在某个类或某个包中使用断言:java -ea:MyClass -ea com.company.mylib... MyApp.也可以用选项-disableassertions或-da禁用某个特定类和包的断言.
11.6 调试技术
JUnit
Logger
printStackTrace
错误信息重定向到文件
-verbose标志,观察类的加载过程
-Xlint选项
程序监控jconsole
-Xprof
Core Java笔记—第11章 异常与调试
最新推荐文章于 2023-11-17 18:14:11 发布