欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java编程思想——第十二章(通过异常处理错误)》

程序员文章站 2024-03-17 17:36:46
...
12.1 概念

发现错误的理想时机是编译时期,然而,编译期间并不能找出所有的错误,余下的问题必须在运行时期解决。

12.2 基本异常

异常是指阻止当前方法或作用域继续执行的问题。

当抛出异常后,首先在堆上创建异常对象,当前的执行路径被终止,并从当前环境中弹出对异常对象的引用。此时,异常处理机制接管程序,并开始寻找一个恰当的地方来继续执行程序。

所有标准类异常都有两个构造器:默认构造器,接受字符串的构造器,以便可以传递相关信息。

throw new NullPointerException("空指针异常");
12.3 捕获异常

如果在方法内部抛出了异常,这个方法将在抛出异常的过程中结束。
如果不希望方法就此结束,可以用try来捕获异常。

try {
    //code
} catch (Exception e1) {
    // TODO: handle exception
}catch (Exception e2) {
    // TODO: handle exception
}

异常处理理论上有两种模型:终止和恢复。

12.4 创建自定义异常

要自己定义异常类,必须从已有的异常类继承。

/**
 * 自定义异常
 * @author Administrator
 *
 */
class SimpleException extends Exception{}
public class InheritingException {
    public void f() throws SimpleException{
        System.out.println("throw throws from f()");
        throw new SimpleException();
    }
    public static void main(String[] args) {
        InheritingException ex = new InheritingException();
        try {
            ex.f();
        } catch (SimpleException s) {
            System.out.println("Catch it");
        }
    }
}
12.5 异常说明

Java鼓励把方法可能会抛出的异常告知使用者。

void f() throws Exception{}

代码必须的异常说明保持一致。

12.6 捕获所有异常

printStackTrace()方法所提供的信息可以通过getStackTrace()方法直接来访问。
这个方法将返回一个由栈轨迹中的元素所构成的数组,其中每个元素都表示栈中一帧。

12.7 Java标准异常

Throwable可以用来表示任何可以作为异常别抛出的类。
Throwable可分为两种类型:Error用来表示编译时和系统错误;Exception是可以被抛出的基本基本类型。

RuntimeException异常是不需要抛出的,它们被称为不受检查异常“”,由虚拟机处理。

12.8 使用finally子句清理

对应一些代码,可能希望无论在try块中是否抛出,它们都能得到执行。可以在异常处理后加上finally子句。
finally子句可以把内存之外的资源恢复到它们的初始状态。

因为finally子句总会执行,所以在一个方法中可以多点返回。

/**
 * finally实现多点返回
 * @author Administrator
 *
 */
public class MutipleReturns {

    public static void f(int i) {
        System.out.println("开始");
        try {
            System.out.println("point 1");
            if(i == 1) return;
            System.out.println("point 2");
            if(i == 2) return;
            System.out.println("point 3");
            if(i == 3) return;
            System.out.println("end");
            return;
        } finally{
            System.out.println("结束");
        }
    }
    public static void main(String[] args) {
        for (int i = 0; i < 4; i++) {
            f(i);
        }
    }
}

异常可能会被丢失:

/**
 * 异常丢失
 * @author Administrator
 *
 */
public class ExceptionSilencer {
    public static void main(String[] args) {
        try {
            throw new RuntimeException();
        } finally {
            return;
        }
    }

}
12.9 异常的限制

当覆盖方法时,只能抛出在基类方法的异常说明里列出的异常。
这个限制意味着当基类使用的代码应用到其派生类对象的时候,一样能工作。

12.10 构造器
12.13 异常使用

java编程思想——第十二章(通过异常处理错误)》