当前位置 >> 课程学习 >> 第5章 异常处理 >> 5.3 抛出异常

5.3 抛出异常

    在Java中可以通过throw语句重新抛出程序中已经处理过的异常或者人为地(故意)抛出任意异常,由于这种异常是人为所致,因此它可以抛出任意的异常,抛出的语句也可以放置在任何地方。其格式为:
       throw 异常对象; //重新抛出异常
    若没有异常对象,可以利用异常类的构造方法直接创建一个异常类的对象,格式为:
    throw new 异常类名([ 实参列表 ]); //人为抛出异常
    Java中大部分异常类都有一个默认的构造方法和一个字符串作为参数的构造方法,其中字符串参数传递的是该异常的描述信息,用getMessage()方法返回的就是该参数字符串。
    【例5.6】重新抛出异常以及人为抛出异常。
    1 //ThrowExceptionTest.java
    2 public class ThrowExceptionTest
    3 {
    4    void func1() throws Exception
    5    {
    6       try
    7       {
    8          System.out.println("exception in func1");
    9          int c=5/0;
    10          System.out.println("c="+c);
    11       }
    12       catch(Exception e)
    13       {
    14          System.out.println("catch exception");
    15          //throw e;
    16       }
    17    }
    18    public static void main(String[] args)
    19    {
    20       ThrowExceptionTest test=new ThrowExceptionTest();
    21       try
    22       {
    23          test.func1();
    24       }
    25       catch(Exception e)
    26       {
    27          System.out.println("catch func1 exception in main");
    28          System.out.println("func1 exception getMessage()="+e.getMessage());
    29       }
    30       try
    31       {
    32          throw new Exception();
    33          //throw new Exception("人为抛出异常");
    34       }
    35       catch(Exception e)
    36       {
    37          System.out.println("catch throw exception");
    38          System.out.println("exception getMessage()="+e.getMessage());
    39       }
    40    }
    41 }
    编译运行该程序,运行结果如图5.7所示,尽管func1()方法中存在异常,但func1()方法中使用try……catch语句进行了捕获处理,因此在main()方法中并不能捕获到func1()中产生的异常。此外由于第32行使用默认构造方法创建的异常类对象,因此在第38行使用getMessage()方法不能获取任何信息。
7
图5.7 程序运行结果
     如果把第15行的注释去掉,同时把第32行替换成第33行,这样程序的运行结果会有很大的不同,注意比较。程序运行结果如图5.8所示。
8
图5.8程序运行结果
     通过上面这个例子,不难看出:对于使用throw语句人为抛出的异常对象若采用默认构造方法,通过getMessage()方法是不能获取其描述信息的,因此一般使用带字符串参数的构造方法。此外需要注意的是在throw语句之后不能有其他语句,而且一般使用throw语句抛出的都是Exception对象。