先说throw,它是一种控制程序流程的特殊方法而已。没有相应的catch的话,可以中止当前的方法继续执行。
这个不做具体的说明,我们重点说一下try/catch和throws的区别与联系
throws在声明方法时候,如果不声明throws的话,那么一般的Exception都要在这个方法中终结。所以他必须有相应的catch处理编译时的一场来避免错误的发生。当声明了throws之后,异常将会被抛出,就像是石头被丢出去一样。但有些异常不能捕捉,这时候就要用到try/catch了。
try/catch可以这样理解,如果throws相当于职业介绍的中介,那么try/catch就是倒霉的打工仔。为什么这么说呢?那是因为,throws只告诉了编译器方法可能产生异常问题,并把问题抛给了try/catch,让try/catch来负责捕获异常。这样看来try/catch就是拿个网兜在那里接石头了。
throws Exception是写在方法后面的,属于契约式编程,就是告诉编译器本方法可能会抛出该类型异常,由方法的调用者去处理。try catch就不用说了,就是那么个意思。
在你编写的程序中,有些语句可以会发生异常,这时Java编译器要求你必须 进行捕获,才可以运行。
(1)如果你不想编写捕获异常的具体代码的话,你可以使用 throws Exception 的形式, 把异常再次抛出,交给JVM(Java虚拟机)可以捕获。这是一种比较省事的办法。
(2)如果你想亲编写处理异常的代码的话,可以使用try{ }catch(){ }的形式,进行捕获, 一旦程序发生异常,它就会安照你catch{ }块编写的代码去执行。
我个人推荐你养成使用后者的习惯!
下面是一个不正确的例子。该例试图引发一个它不能捕获的异常。因为程序没有指定一个throws子句来声明这一事实,程序将不会编译。
- class ThrowsDemo {
- static void throwOne() {
- System.out.println("Inside throwOne.");
- throw new IllegalAccessException("demo");
- }
- public static void main(String args[]) {
- throwOne();
- }
- }
为编译该程序,需要改变两个地方。第一,需要声明throwOne( )引发IllegalAccessException异常。第二,main( )必须定义一个try/catch 语句来捕获该异常。
正确的例子如下:
- class ThrowsDemo {
- static void throwOne() throws IllegalAccessException {
- System.out.println("Inside throwOne.");
- throw new IllegalAccessException("demo");}
- public static void main(String args[]) {
- try {
- throwOne();
- } catch (IllegalAccessException e) {
- System.out.println("Caught " + e);
- }
- }
- }
下面是例题的输出结果:
inside throwOne
caught java.lang.IllegalAccessException: demo
throws 只是把一个异常抛出去了,如果你的上层代码有处理方式,就由上层代码来处理这个异常。
而try/catch对是清楚的知道该操作可能出现什么异常,同时在catch块中应该有处理的方法。
而且还有一种方式就是try/catch/finaly的方式。