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

问题描述 投票:0回答:3

最近为了考试开始学习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.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. 将文件中的导入语句从
    import com.test.helpers.*;
    更改为
    import com.test.helpers.A
    App.java

如果您能解释一下这里发生的情况,我将不胜感激。或者我可能会犯一个愚蠢的人为错误或语法错误。

这是源文件的链接

java import package
3个回答
10
投票

您好,这里的问题是,由于两个目录(

ambiguous
JavaTest
目录)中的
com.test.helpers
类文件名,JVM 混淆了类文件。

当你这样做时

javac -d . A.java
编译器会在目录
com.test.helpers
中创建一个类文件,现在它将它与
JavaTest

中的源文件混淆
  1. Deleting the Source file A.java

当您从

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

  1. Changing the import statement from 'import com.test.helpers.*;' to 'import com.test.helpers.A' in the file, 'App.java'.

在这里,您指定在类实现中使用哪个特定文件,即告诉编译器使用来自

A.java
的文件
com.test...
,而不是来自
JavaTest

现在,这种歧义的解决方案对您来说永远不会成为问题,您必须使用 import 语句导入特定文件,即

import com.test.helpers.A;
或者如果您想做
import com.test.helpers.*;
那么您必须专门使用
com.test.helpers.A
代替
A
在当前类实现中的任何地方,告诉编译器不要将其与
JavaTest

处的源混淆

我知道这个特定的答案已经很晚了,但我想与即将到来的读者分享我的观点,如果它能以任何方式帮助他们,那就太好了。 谢谢!


4
投票

将JavaTest文件夹下的A.java移至com/test/helpers。您看到的错误是编译器抱怨 A.java 所在的文件夹与其包声明不匹配。请记住,如果 A 不在包中,您就无法从 App 访问 A。

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

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

然后从 src 文件夹下

src>java App

应该运行你的程序。


2
投票

文件 A.java 应该位于 JavaTes 路径中

© www.soinside.com 2019 - 2024. All rights reserved.