Java错误-坏的源文件:文件不包含类x.请删除或确保它出现



最近为了考试开始学习Java。

在学习包时,尝试了这个,得到了一个错误消息。我所做的是


//Creating class A (Within package the package: com.test.helpers)
    
package com.test.helpers;
public class A {
    public void sayHello(){
        System.out.println("Hello World");
    }
}

//And then the class App utilising the class A
    
import com.test.helpers.*;
public class App{
  public static void main(String args[]){
    A a = new A();
    a.sayHello();
  }
}

我将这两个文件放在一个名为"JavaTest"的目录中(在Windows 7上),并首先使用命令javac -d . A.java

编译a.c java。

然后,当尝试编译App.java时,我得到以下错误消息:


App.java:5: error: cannot access A
                A a = new A();
                ^
bad source file: .A.java
  file does not contain class A
  Please remove or make sure it appears in the correct subdirectory of the source path.
1 error

然而,这个问题似乎有两种解决方法,

  1. 删除源文件A.java
  2. 将文件App.java中的导入语句从import com.test.helpers.*;更改为import com.test.helpers.A

如果你能解释一下这里发生了什么,我将非常感激。或者我可能犯了一个愚蠢的人为错误或语法错误。

这是到源文件的链接

嗨,这里的问题是JVM混淆了类文件,因为两个目录(JavaTestcom.test.helpers目录)中的ambiguous类文件名。

当你执行javac -d . A.java时,编译器在com.test.helpers目录下生成一个类文件,现在它将其与JavaTest中的源文件混淆了

  1. Deleting the Source file A.java

当您从JavaTest中删除源文件A.java时,JVM现在知道要使用com.test....中的类文件,歧义就消失了。

  • Changing the import statement from 'import com.test.helpers.*;' to 'import com.test.helpers.A' in the file, 'App.java'.
  • 这里你指定了在你的类实现中使用哪个特定的文件,也就是说你告诉编译器使用com.test...中的A.java文件,而不是JavaTest

    现在,解决这个歧义的方法对你来说不是一个问题,你必须用import语句导入特定的文件,即import com.test.helpers.A;,或者如果你想做import com.test.helpers.*;,那么你必须在当前类实现的任何地方使用com.test.helpers.A来代替A,以告诉编译器不要将其与JavaTest的源代码混淆

    我知道现在回答这个问题有点晚了,但我想和即将到来的读者分享我的观点,如果它能以任何方式帮助他们,那就太好了。谢谢!

    移动文件夹JavaTest下的A.java到com/test/helpers。您看到的错误是编译器抱怨a.c java位于与其包声明不匹配的文件夹中。记住,如果A不在包中,你就不能从App访问A。

    从SRC目录下运行以下命令编译你的类

    src> javac ./*.java ./com/test/helpers/*.java
    

    然后从SRC文件夹

    src>java App
    

    文件A.java应该在路径JavaTestcomtesthelpersA.java

    ,不要忘记这样编译它:Javac -d。com test 助手 A.java

    一切都在正确的地方,java不要求把你的a.c java文件,在助手文件夹

    你的代码运行与a.c java文件删除,而不是其他的全部原因是:当你的app.java(或主java文件,其中导入其他类,->)是在一个默认的包中,然后在导入类时,它会优先考虑相同的目录,而不是包目录(如果存在任何与类文件同名的文件->,这就是为什么它给出错误的源文件a .java ->,因为它想要a .class)

    因此在java中有一条规则:永远不要将。java文件(同名)与包

    并行放置。

    所以要解决这个问题,你必须要么删除文件,A.java或者将其重命名(为包中没有出现的任何其他名称)或者可以使用完全限定的import语句

    我终于遇到了同样的问题,

    我被解决了。

    //Use like this
    import com.test.helpers.A;
    

    如果在com.test中有多于一个的类。

    则可以使用import com.test.helpers.*;

    如果您没有使用auto-save的编辑器,那么检查您编写的代码是否实际上已保存到先前创建的java文件

    可能会有所帮助。

    bad source file错误可能是错误的,如果它之前是另一个错误(下面),在我的情况下,提供了如何解决实际问题的指导。从我的日志文件:

    Error 1: agGoodClass error:duplicate class: a.g.GoodClass //Not the problem
    Error 2: abBadClass error: cannot access GoodClass        //The problem
             bad source file: agGoodClass                     //No, it's fine
             file does not contain class x.y.GoodClass          //How to fix it
             Please remove or make sure it appears in the correct subdirectory of the sourcepath.
    

    Java报告错误2的第一行,因为BadClass使用了通配符导入,import x.*;import x.y.*;

    修复方法:从BadClass中删除通配符import,只添加库x.y中需要的特定导入

    最新更新