public class X { 
public static void main(String [] args) { 
try { 
badMethod(); 
System.out.print("A"); 

catch (Exception ex) { 
System.out.print("C"); 

finally { 
System.out.print("B"); 

System.out.print("D"); 

public static void badMethod() { 
throw new Error(); 

}
public class X { 
public static void main(String [] args) { 
try { 
badMethod(); 
System.out.print("A"); 

catch (Error ex) { 
System.out.print("C"); 

finally { 
System.out.print("B"); 

System.out.print("D"); 

public static void badMethod() { 
throw new Error(); 

}这两段代码,第一段输出“B”,第二段输出“CBD”
第一段代码:为什么在抛出Error的情况下没有终止程序,而继续执行了finally中的代码段?
第二段代码:为什么在catch中捕获Error后,可以执行finally甚至finally后的代码?
以前看到的Exception和Error的介绍是这样的:error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。
exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。
顺便再写一题:如下代码: 
public class X { 
public X aMethod() { return this;} 

public class Y extends X { 

哪两个方法能加到Y类的定义中? 
A. public void aMethod() {}  B. private void aMethod() {} 
C. public void aMethod(String s) {}  D. private Y aMethod() { return null; } 
E. public X aMethod() { return new Y(); } 
这个题题目说满足条件的是两个,为什么在eclipse中编写后,只有C可以通过编译,E为什么不能通过?

解决方案 »

  1.   

    error不是一个Exception的派生类型,所以无法被catch(Exception)捕捉,但其中断了程序执行,而finally在程序中断后执行所以只输出b
    第二题不解,正确答案应该是ce,e应该没啥错误啊,最多是需要加个强制转换再return...
      

  2.   

    补充一下,第一题的第二个因为catch捕捉成功并不会中断程序,所以程序跳转catch块,然后执行finally块,然后继续执行
      

  3.   

    error是JVM内部错误,无法被人为处理的。而Exception是程序运过程中出现的异常,可以被程序处理的。
      

  4.   

    表示E可以编译通过的啊,lz再试试吧
      

  5.   

    public class X 

    public static void main(String [] args) 
    {
            try {
            badMethod();
            System.out.print("A");
     } 
    catch (Exception ex) 
    {
            System.out.print("C"); 
    }
     finally { System.out.print("B");
     } 
    System.out.print("D");
    }
     public static void badMethod() 
    {
            throw new Error();
    } } 
    这个代码我在命令窗口执行编译通过,执行不能通过;public class X

    public static void main(String [] args)
            { 
    try {
            badMethod(); 
          System.out.print("A"); 
    }
          catch (Error ex)  //捕获异常
          { 
          System.out.print("C");
          } 
          finally 
          {
          System.out.print("B"); 
          }
          System.out.print("D");
            }
          public static void badMethod() 
          { 
          throw new Error();  //声明了一个异常
          } } 
    第二个代码输出BCD,
    方法声明会抛出一个new Error()的异常;
    这个异常抛出后,会调用catch块,类似于方法的调用,从一定意思上讲,catch块就像带参数的方法定义,这些参数匹配抛出值的类型,异常被catch捕获,执行catch块中的代码,从而处理这个异常。
    因此,抛出的异常被捕获,就要主要,抛出异常的类型,和catch块捕获异常的类型是否相同,:
    第一个代码中,抛出的类型new Error()与catch块接受的类型Exception ex不相同,所以这个异常不会被捕获,代码就不会有执行结果。
    第二个代码: 抛出new Error()类型的异常,而catch块捕获的也是Error ex的异常,因此,这个异常会被捕获,从而执行整个异常结构,输出BCD
      

  6.   

    我的环境是:Eclipse3.5,jdk1.6 单独编译,ABCDE都可以编译通过:
    public class X {
    public X aMothod(){return this;}
    }public class Y extends X{
    //  public void aMethod() {} 
    //  private void aMethod() {}  
    //  public void aMethod(String s) {} 
    //  private Y aMethod() { return null; }  
    //  public X aMethod() { return new Y(); }
    }
    楼主的环境是不是和人家不一致?
      

  7.   

    第一题:
        第一段代码:在main方法中执行到badMethod()时候抛出new Error(),Error是不能被Exception捕获的,所以会导致程序中断,而只会打印出B。
    在任何try{}catch(){}finally{}中,无论出现什么异常或者是错误,程序都会执行finally中的代码,所以在很多关于IO流的关闭中,一部分人都是在finally中执行关闭的,因为放在finally中一定会执行的。    第二段代码:在main方法中执行到badMethod()时候抛出的new Error()被其Error捕获,所以程序不中断,继续执行finally中的内容和后续的内容。
      

  8.   

    跟你的环境一样呀,上面说编译错误有一种叫做方法重复,确实是这样的,eclipse就是显示说是方法重复。
      

  9.   

    那要怎么贴?方法重载和方法重写不都是这样吗?E不就算是一个方法重写吗?我就卸载同一package下的两个类文件中了。显示的编译错误确实是方法重复。
      

  10.   

    坑爹的校园网啊,我敲好了回复,点提交回复好久都没有跳到回复完的页面,以为回复了,就按F5,这下悲剧了,没回复到,,,坑爹啊星期五晚上的校园网,又没复制到。
    A 编译失败 // 原因:重写的方法和被重写的方法要有相同的返回值
    B 编译失败 // 原因:无法覆盖,访问权限太低。要相同(public)
    C 编译通过 // 原因: 参数列表不同,属于重载
    D 编译失败 // 原因:和B一样,访问权限太低
    E 编译通过 // 原因:A的原因,都是返回一个对象。
    直接通过cmd 命令编译,不太爱用eclipse,因为初学不久,刚好学过这个知识点,所以,,,还有第一体各位大大解释的都很对,对了,那个大大用eclipse编译的全通过,那我就有点怀疑eclipse,不对,应该是他配置的或其他原因,,哈哈哈哈嘻嘻嘻,纯个人见解。ps:这回应该成功回复了吧,先Ctrl c先,再次吐槽学校的网速下
      

  11.   

    还有,一个java文件不能有两个被public修饰的class,只能有一个public class xxx,eclipse有两个public class 也能编译成功啊?求真相
      

  12.   

    Exception和Error都是Java设计出来进行异常捕获的方式,他们都是继承Throwable,连构造方法的形式都一样,看你怎么用,理论上只要是错误都可以用它俩来捕获。
      

  13.   

     如果在try 里面 有System.exit(0);  finally是不会执行的
      

  14.   

    帮忙看看,我的确实编译不通,在上面也贴图了。有的说是有一种编译错误是方法重复,的确显示出这样的编译错误。我的是在eclipse3.5中编写的。是放在同一个package中的两个class文件。你是怎么编译通过的?
      

  15.   

    ....楼主,我是指一道多选题的所有正确选项都贴在一起编译的确可能会造成方法重复,java里具有相同参数类型的方法就视为同一个方法,不判断返回类型的,所以你两个正确答案对编译器来说是同一个方法,当然会报方法重复的错误了
      

  16.   

    是的,我把其他三个删除了,现在可以了。thx