throw 如上面所说,throws 是用来声明一个方法可能抛出的所有异常信息,抛出的是异常类,那么throw 就是如Java 面向对象思想里面的类和对象的关系,因为throw 要抛出的是一个具体的异常对象,而不是异常类。 throw 则需要用户自己捕获相关的异常,而后再对其进行相关包装,最后再将包装后的异常信息抛出。
通常在一个方法(类)的声明处通过 throws 声明方法(类)可能抛出的异常信息,而在方法(类)内部通过 throw 声明一个具体的异常信息。
throws throw 的用法
如果在方法中会有异常被抛出而你又不希望在这个方法体内对此异常进行处理,可以使用throws在声明方法的时候同时声明他可能会抛出的异常。比如:
public void go() throws SQLException { ... Connection conn = ds.getConnection(); ... } |
本来ds.getConnection()将可能会抛出SQLException,但现在使用throws 在方法名处声明了,所以在方法体中就不需要 try/catch 块来处理SQLException 了
throws 用来标明一个成员函数可能抛出的各种"异常"。对大多数Exception子类来说,Java编译器会强迫你 声明在一个成员函数中抛出的"异常"的类型。如果"异常"的类型是Error或RuntimeException,或它们的子类,这个规则不起作用,因为 这在程序的正常部分中是不期待出现的。如果你想明确地抛出一个RuntimeException,你必须用throws语句来声明它的类型。这就重新定义 了成员函 数的定义语法:
type method-name(arg-list) throws exception-list { }
下面是一段程序,它抛出了一个"异常", 但既没有捕捉它,也没有用throws来声明。这在编译时将不会通过。
class ThrowsDemo1 { static void procedure( ) { System.out.println("inside procedure"); throw new IllegalAccessException("demo"); } public static void main(String args[]) { procedure( ); } } |
为了让这个例子编译过去,我们需要声明成员函数procedure抛出了IllegalAccessException,并且在调用它的成员函数main里捕捉它。下面是正确的例 子:
class ThrowsDemo{ static void procedure( ) throws IllegalAccessException{ System.out.println("inside procedure"); throw new IllegalAccessException("demo"); } public static void main(String args[]) { try { procedure( ); }catch (IllegalAccessException e) { System.out.println("caught " + e); } } } |
下面是输出结果: C:\>java ThrowsDemo inside procedure caught java.lang.IllegalAccessException: demo
1、两者位置不同。throws 在声明方法的同时声明要抛出一个异常类,而throw 是在方法内部实现,抛出一个具体的异常对象
2、对异常处理方式不同。throws 对异常不处理,谁调用谁处理,throws的Exception的取值范围要大于方法内部异常的最大范围,而cathch的范围又要大于throws的Exception的范围;throw 主动抛出自定义异常类对象。