请检查在com.bruceeckel.util.*这个包的根路径上是不是存在着Array2.java即com.bruceeckel.util.Array2的源文件,如果存在就会出现这个错误
但是如果把原文件删掉或移走,则上面两种导入都是正确的原因可能是系统类装载器在搜索类路径时,如果遇到了源文件就会临时编译它(并在推出JVM时删除它),但只会使用默认的命令行参数,但对于使用了packege命令的类,应该使用-d <root>参数,因此类装载器会载入两个类Array2和com.bruceeckel.util.Array(也许还到不了装载后一个类就报错了),所以出现了那个错误,找不到正确的类

解决方案 »

  1.   

    里面没有Array2.java文件,
    Arrays2.print("it's a",sString);
    改成
    com.bruceeckel.util.Arrays2.print("it's a",sString);
    可以,
    还会是什么问题呢?
      

  2.   

    那么可能是Array2.java这个源文件在你的类路径之中,你使用类的全名,当然系统类装载器知道你要是用哪个类了,刚才的情况是在系统类装载器中同时存在两个Array2类(一个是临时编译生成的,但在JVM退出时自动删除),而你的程序中也没有指出你要是用哪个,类装载器只好告诉你我不知道你要哪个,只好报错了
      

  3.   

    good!你说的是对的。
    我刚才把那个Arrays2移除了,是可以了。
    我用的是jcreator,所有的.java文件都放在一个目录里面,它执行的时候把那个目录当作当前目录了,然后系统类装载器在搜索类路径就装载了这个目录中的Array2.java,是不是这样的?
    不过还有些不明白的就是
    系统类装载器遇到了源文件就会临时编译后,这两个类是不是都会编译?
    “一个是临时编译生成的,但在JVM退出时自动删除”什么意思?
    菜鸟,还望指教。
      

  4.   

    系统类装载器遇到了源文件就会临时编译后生成新类,
    虽然有2个类,但
    两个类不管装载哪个类应该都可以用Array2.java,
    为什么不行呢?
      

  5.   

    上面的打错了,是Arrays2.print("it's a",sString);