1、异常分类
所有的异常都是由 Throwable 继承而来,但在下一层立即分解为两个分 支:Error 和 Exception。Error类层次结构描述了 Java 运行时系统的内部错误和资源耗尽错误。应用程序不应该 抛出这种类型的对象,没办法解决。Exception又分解为两个分支: 一个分支派生于 RuntimeException ; 另一个分支包含其他异常。划分两个分支的规则是: 由程序错误导致的异常属于 RuntimeException ; 而程序本身没有问题, 但由于像 I/O 错误这类 问题导致的异常属于其他异常。
派生于 RuntimeException 的异常包含下面几种情况: 1)错误的类型转换 2)数组访问越界 3)访问 null 指针
不是派生于 RuntimeException 的异常包括: 1)试图在文件尾部后面读取数据 2)试图打开一个不存在的文件。 3)试图根据给定的字符串查找 Class 对象, 而这个字符串表示的类并不存在。
如果出现 RuntimeException 异常, 那么就一定是你的问题。
2、声明受查异常
方法应该在其首部声明所有可能抛出的异常。
在遇到下面 4 种 情况时应该抛出异常:
1 ) 调用一个抛出受査异常的方法, 例如, FilelnputStream 构造器。
2 ) 程序运行过程中发现错误,并且利用 throw语句抛出一个受查异常。
3 ) 程序出现错误, 例如,a[-l]=0 会抛出一个 ArraylndexOutOffloundsException 这样的非受查异常。
4 ) Java 虚拟机和运行时库出现的内部错误。
如果一个方法有可能抛出多个受查异常类型, 那么就必须在方法的首部列出所有的异常 类。每个异常类之间用逗号隔开。 例:
class MyAnimation {
public Image loadlmage(String s) throws FileNotFoundException, EOFException
{
…
}
}
如果在子类中覆盖了超类的一个方法, 子类方法中声明的受查异常不能比超类方 法中声明的异常更通用(也就是说, 子类方法中可以抛出更特定的异常, 或者根本不抛 出任何异常) 。特别需要说明的是, 如果超类方法没有抛出任何受查异常, 子类也不能抛 出任何受查异常。
3、抛出异常范文代码
String readData(Scanner in) throws EOFException{
…
while (…) {
if (Mn.hasNextQ) // EOF encountered
{
if (n < len)
throw new EOFExceptionQ;
}
…
}
return s;
}
过程:
1 ) 找到一个合适的异常类。 2 ) 创建这个类的一个对象。 3 ) 将对象抛出。
4、捕获异常
用try catch语句块。
如果方法中的任何代码拋出了一个在 catch 子句中没有声明的异常类型,那么这个方法 就会立刻退出。
如果某个异常发生的时候没有在任何地方进行捕获,那程序就会终止执行,并在控制台 上打印出异常信息, 其中包括异常的类型和堆栈的内容。
捕获多个异常:多个catch语句后面跟不同情况选择。
5、finally 子句
当代码抛出一个异常时, 就会终止方法中剩余代码的处理,并退出这个方法的执行。如 果方法获得了一些本地资源,并且只有这个方法自己知道,又如果这些资源在退出方法之前 必须被回收,那么就会产生资源回收问题。
不管是否有异常被捕获,finally 子句中的代码都被执行。
当 finally 子句包含 return语句时, 将会出现一种意想不到的结果„ 假设利用 return 语句从 try语句块中退出。在方法返回前,finally 子句的内容将被执行。如果 finally 子句中 也有一个 return 语句,这个返回值将会覆盖原始的返回值。
6、带资源try
try (Resource res = . . .) {
work with res
}
try块退出时,会自动调用 res.dose()。
7、断言
断言机制允许在测试期间向代码中插入一些检査语句。当代码发布时,这些插人的检测 语句将会被自动地移走。
Java语言引人了关键字 assert。这个关键字有两种形式: 1)assert 条件; 2)assert 条件:表达式
这两种形式都会对条件进行检测, 如果结果为 false, 则抛出一个 AssertionError 异常。 在第二种形式中,表达式将被传人 AssertionError 的构造器,并转换成一个消息字符串。
在默认情况下,断言被禁用。
java -enableassertions MyApp 运行程序时启用
java -ea:MyClass -eaiconi.inycompany.inylib…, MyApp 也可以在某个类或整个包中使用断言
java -ea:… -da:MyClass MyApp 也可以用选项-disableassertions 或 -da 禁用某个特定类和包的断言
什么情况使用断言:
1)断言失败是致命的、 不可恢复的错误。
2)断言检查只用于开发和测阶段。
8、基本日志
Logger.getClobal0,info(“File->Open menu item selected”); 生成简单的全局日志记录
Logger.getClobal().setLevel(Level.OFF); 在main 开始调用 ,将会取消所有的日志。
9、高级日志
在一 个专业的应用程序中,不要将所有的日志都记录到一个全局日志记录器中,而是可以自定义 日志记录器。
法创建或获取记录器:private static final Logger myLogger = Logger.getLogger(“com.mycompany.myapp”)
Java核心技术-异常、断言和曰志
最新推荐文章于 2024-08-04 16:08:29 发布