是这样的
我有一个a.java类.这个类里面有2个方法是B()和C().
B()方法中调用了b.java里面的方法
C()方法中调用了c.java里面的方法
也就是说a.java中import了b.java和c.java
然后将a.java、b.java、c.java三个类都编译成了.class文件放在项目环境中。有一个test.jsp界面,import了a.java,然后调用B()方法,此时系统正常
然后我将c.class文件在项目环境中删掉,再调用B()方法,此时系统依然正常。B()方法存在与a.java中,而a.java导入的c.java已经被我删除掉了,他怎么不出异常呢。

解决方案 »

  1.   

    B()方法中调用了b.java里面的方法
    C()方法中调用了c.java里面的方法调用B()方法跟c.java有关系吗?
      

  2.   

    没有执行,确切的说,jvm还没有加载这个类,应该是不会报错的。你现在是编译的环境,还没有开始运行。
      

  3.   

    调用B()方法跟c.java没有关系,但 B()是在a.java中,而a.java引入的c.java已经被删除
    怎么不会报出找不到类的异常呢?
      

  4.   

    编译时c.java存在,所以编译是通过了
    在项目环境运行时将引入类删除掉,按理说jvm在加载a.java时解析到import c.java。而没发现这个类的存在,应该会报错呀
      

  5.   

    可能是动态加载的原因吧,运行中的a.class中,因为只是运行其中的B()方法,而B()方法中没有引用到c.class,所以没有报错,等熟悉jvm的来解答吧。
      

  6.   

    1) 导入的是.class不是.java,.java删1万次也没事
    2) B()调用的不是b.java中的方法吗,关c何事
      

  7.   

    一般而言,应该报错!但是,如果1.没执行到c.java,不会报异常;2.如果执行到c.java,但由于编辑器反应迟钝,可能也不报错
      

  8.   

    那运行到A呢,会不会报错,B和C本来没关系啊,要是你用eclipse删了还是会生成的
      

  9.   


    我是在项目运行环境中删除的。和eclipse无关。
    所以就感到奇怪,开始以为是缓存问题,将缓存清楚以后,程序依然没错
      

  10.   

    这东西取决于类的加载策略。看起来好像是调用的时候才去加载。坐等大牛讲解java类加载策略。
      

  11.   

    这种情况很正常,JVM 的 client 模式不会一启动就加载所有 class。
    只有执行到相关代码时才会载入。
      

  12.   

    编译的时候是没有问题的,已经是编译好的文件了,
    如果不执行相关方法,它不会调用c.java。所以不会报错。
    如果执行到c()时,就会报错的。