异常
Java把所有的非正常信息分成两类:
- 异常
- 错误
这两类异常都是继承于Throwable。
Java异常捕获有一个特点就是,把小异常放在catch块的前面进行先处理,然后再捕获大异常,把大异常放在catch块的后面。
有的时候在try块里面打开的物理资源(例如:数据库连接、网络连接和磁盘文件等),这些物理资源都必须显示的回收。Java的垃圾回收机制是不会回收任何的物理资源,垃圾回收机制只能回收堆内存中的对象所占用的内存。这就必须使用finally来完成垃圾的回收。
Java的异常也被分成两类:Checked异常和Runtime异常。所有的RuntimeException类及其子类的实例都被称为Runtime异常,不是RuntimeException类及其子类的异常实例则被称为Checked异常。
自定义异常
如果是自定义检查性异常则需要继承Exception基类,然后提供一个无参的构造器,以及一个带字符串的有参数构造器,并且将这个字符串参数作为该异常对象的描述信息。例如:
public class ExceptionTest extends Exception {
public ExceptionTest() {}
public ExceptionTest(String msg) {
super(msg);
}
}
如果定义的是非检查性异常(也就是运行时异常),就需要自定义的类继承RuntimeException类,并且提供两个构造器,提供的形式如检查性异常一样。
public class RuntimeExceptionTest extends RuntimeException {
public RuntimeExceptionTest() {}
public RuntimtExceptionTest(String msg) {super(msg);}
}
对于异常信息的处理一般的做大是:层与层之间的异常信息有非常清晰的划分,上层功能的实现严格依赖于下层的API,但是不会跨界访问。例如:当业务逻辑层出现SQLException异常的时候,程序不应该把底层的SQLException异常传到用户界面,通常的做法是在程序中先捕获原始的异常信息,然后抛出一个新的业务异常,新的业务异常中包含了对用户的提示信息。这种处理方式被称为异常转译。例如:
public void exceptionMethod() throws SalException {
try {
...
} catch(SQLException e) {
// 做一些处理
...
// 包装异常,抛出一个新的异常
throw new SalException(...);
}
}
网友评论