Java学习笔记6

异常

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(...);
    }
}

你可能感兴趣的:(Java学习笔记6)