在JAVA解惑一书中 看到这样的一个例子:
public class Strange1{
   public static void main(String []args){
      try{
          Missing m=new Missing();
       }catch(java.lang.NoClassDefFoundError ex){
          System.out.print("Got it");
         }
    }
}public class Strange2{
   public static void main(String []args){
       Missing m; 
     try{
           m=new Missing();
       }catch(java.lang.NoClassDefFoundError ex){
          System.out.print("Got it");
         }
    }
}
都用到了下面的这个类:
class Missing{
  Missing(){};
}现在的问题是这样的:如果你编译所有的这三个类,然后在运行Strange1和Strange2之前删除Missing.class文件,你就会发现这2个程序的行为有所不同。其中第一个抛出了NoClassDefFoundError异常,而另一个却打印了Got it.按理来说程序Strange1只在其try语句块中提及Missing类型,因此你可能会认为它能捕获异常,Strange2可能会产生NoClassFoundError异常 而结果确完全相反 这是为什么??? 求大牛讲解 谢谢了

解决方案 »

  1.   

    经实地执行,两个都到catch里了,都打印了Got itjavap -c Strange看下就明了了
      

  2.   

    Missing m这个地方抛出异常,第一个程序的Missing m没有放在try里面,所以异常没捕捉到,就抛出了,第二个捕捉到了,打印got it,就这样
      

  3.   

    应该是说Missing m比new Missing()先抛出异常,后面的异常就短路了
      

  4.   

    bebug看是执行到new Missing()才报的错
      

  5.   


    使用cmd - javac - 删除 miss.class - java, 表现结果行为一直,都打印了Got it
    通过myeclipse ide 编译 手动去删classes文件夹里的miss.class 表现结果和楼主一致
    所以...个人感觉,没有意义的研究
      

  6.   


    使用cmd - javac - 删除 miss.class - java, 表现结果行为一直,都打印了Got it
    通过myeclipse ide 编译 手动去删classes文件夹里的miss.class 表现结果和楼主一致
    所以...个人感觉,没有意义的研究
      

  7.   

    使用cmd - javac - 删除 miss.class - java, 表现结果行为一直,都打印了Got it
    通过myeclipse ide 编译 手动去删classes文件夹里的miss.class 表现结果和楼主一致
    所以...个人感觉,没有意义的研究
    我这里只是探讨哪种的方法好用 让代码跟安全  
      

  8.   

    使用cmd - javac - 删除 miss.class - java, 表现结果行为一直,都打印了Got it
    通过myeclipse ide 编译 手动去删classes文件夹里的miss.class 表现结果和楼主一致
    所以...个人感觉,没有意义的研究
    我这里只是探讨哪种的方法好用 让代码跟安全  
      

  9.   


    用的是 myEclipse IDE 测试的 
      

  10.   

    Strange2 会打印出 NoClassDefFoundError 因为定义了 Missing m;当运行到这里发现没有这个类,而又定义在try的外层,还没进到捕获异常的里面。 
    Strange1 会打印出   Got it ,这个因为Missing m 在try的里面定义的。