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);
}
}
}

解决方案 »

  1.   

    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);
    }
    }
    }
      

  2.   

    下面这段是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);
    //}
    }
    }
    你想一下,这个原因不就很清楚了吗?
      

  3.   

    你的throwMethod()本意是想抛出一个IllegalAccessException异常,然后在main函数里调用的时候捕捉住这个异常是吧, 但是看你的代码,你在throwMethod()方法里已经把throw new IllegalAccessException("demo");注释掉了,所以这个方法就不会再抛出IllegalAccessException异常。 所以你在下面还 要捕捉这个异常的话,就会报错了。改成Exception e 之所以能成功的原因是,Exception是所有异常的基类,它的范围最广不是针对具体哪一个异常的,它可以捕捉到所有类型的异常信息。如果你想捕捉具体的异常的话,必须先明确你调用的方法里会不会抛出这个具体的异常,就是说前后你得匹配起来才行,如果这个地方我捕捉一个FileNotFoundException异常的话,照样会出错,因为那个方法里根本就不会抛出这个异常。