日期:2014-05-20  浏览次数:20842 次

为什么报错呢?
class   ThrowsDemo{
static   void   throwMethod()   {
System.out.println( "inside   throwMethod ");
//throw   new   IllegalAccessException( "demo ");

}

public   static   void   main(String   arg[]){
try{
throwMethod();
}catch(IllegalAccessException   e){   //改成(Exception   e)就对了。不晓得为什么?
System.out.println( "Caught "   +e);
}
}
}

------解决方案--------------------
class ThrowsDemo{
static void throwMethod() throws IllegalAccessException {
System.out.println( "inside throwMethod ");
throw new IllegalAccessException( "demo ");

}

public static void main(String arg[]){
try{
throwMethod();
}catch(IllegalAccessException e){ //改成(Exception e)就对了。不晓得为什么?
System.out.println( "Caught " +e);
}
}
}
------解决方案--------------------
下面这段是JAVA6.0的API里对IllegalAccessException的解释:
public class IllegalAccessException
extends Exception
当应用程序试图反射性地创建一个实例(而不是数组)、设置或获取一个字段,或者调用一个方法,但当前正在执行的方法无法访问指定类、字段、方法或构造方法的定义时,抛出 IllegalAccessException。

我把你的程序改成如下的代码,它可以正常编译运行。
class ThrowsDemo{
static void throwMethod() {
System.out.println( "inside throwMethod ");
//throw new IllegalAccessException( "demo ");

}

public static void main(String arg[]){
//try{
throwMethod();
//}catch(IllegalAccessException e){ //改成(Exception e)就对了。不晓得为什么?
//System.out.println( "Caught " +e);
//}
}
}
你想一下,这个原因不就很清楚了吗?
------解决方案--------------------
你的throwMethod()本意是想抛出一个IllegalAccessException异常,然后在main函数里调用的时候捕捉住这个异常是吧, 但是看你的代码,你在throwMethod()方法里已经把throw new IllegalAccessException( "demo ");注释掉了,所以这个方法就不会再抛出IllegalAccessException异常。 所以你在下面还 要捕捉这个异常的话,就会报错了。

改成Exception e 之所以能成功的原因是,Exception是所有异常的基类,它的范围最广不是针对具体哪一个异常的,它可以捕捉到所有类型的异常信息。

如果你想捕捉具体的异常的话,必须先明确你调用的方法里会不会抛出这个具体的异常,就是说前后你得匹配起来才行,如果这个地方我捕捉一个FileNotFoundException异常的话,照样会出错,因为那个方法里根本就不会抛出这个异常。