首页 > 编程笔记

Java throw:异常的抛出

到目前为止,你只是获取了被 Java 运行时系统抛出的异常。然而,程序可以用 throw 语句抛出明确的异常。Java Throw 语句的通常形式如下:

throw ThrowableInstance;

这里,ThrowableInstance 一定是 Throwable 类类型或 Throwable 子类类型的一个对象。简单类型,例如 int 或 char,以及非 Throwable 类,例如 String 或 Object,不能用作异常。

有两种可以获得 Throwable 对象的方法:在 catch 子句中使用参数或者用 new 操作符创建。

程序执行在 throw 语句之后立即停止,后面的任何语句不被执行。最紧紧包围的 try 块用来检查它是否含有一个与异常类型匹配的 catch 语句。如果发现了匹配的块,控制转向该语句;如果没有发现,次包围的 try 块来检查,以此类推。如果没有发现匹配的 catch 块,默认异常处理程序中断程序的执行并且打印堆栈轨迹。

下面是一个创建并抛出异常的例子程序,与异常匹配的处理程序再把它抛出给外层的处理程序。
// Demonstrate throw.
class ThrowDemo {
    static void demoproc() {
        try {
            throw new NullPointerException("demo");
        } catch(NullPointerException e) {
            System.out.println("Caught inside demoproc.");
            throw e; // rethrow the exception
        }
    }

    public static void main(String args[]) {
        try {
            demoproc();
        } catch(NullPointerException e) {
            System.out.println("Recaught: " + e);
        }
    }
}
该程序有两个机会处理相同的错误。首先,main() 设立了一个异常关系然后调用 demoproc()。demoproc() 方法然后设立了另一个异常处理关系并且立即抛出一个新的 NullPointerException实例,NullPointerException 在下一行被捕获,异常于是被再次抛出。

下面是输出结果:

Caught inside demoproc.
Recaught: java.lang.NullPointerException: demo


该程序还阐述了怎样创建 Java 的标准异常对象,特别注意下面这一行:

throw new NullPointerException("demo");

这里,new 用来构造一个 NullPointerException 实例。所有的 Java 内置的运行时异常有两个构造函数:一个没有参数,一个带有一个字符串参数。当用到第二种形式时,参数指定描述异常的字符串。如果对象用作 print() 或 println() 的参数时,该字符串被显示。这同样可以通过调用 getMessage() 来实现,getMessage() 是由 Throwable 定义的。

优秀文章