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

Java错误-错误的源文件:文件不包含类x。请删除或确保它出现,java,import,package,Java,Import,Package,最近开始学习Java准备考试 在学习软件包时,尝试此操作并收到错误消息。我所做的是 //创建类A(在包中:com.test.helpers) 包com.test.helpers; 公共A类{ 公共空间{ System.out.println(“你好世界”); } } //然后使用类A的类应用程序 导入com.test.helpers.*; 公共类应用程序{ 公共静态void main(字符串参数[]){ A=新的A(); a、 你好; } } 我把这两个文件都放在一个名为“JavaTe

最近开始学习Java准备考试

在学习软件包时,尝试此操作并收到错误消息。我所做的是


//创建类A(在包中:com.test.helpers)
包com.test.helpers;
公共A类{
公共空间{
System.out.println(“你好世界”);
}
}

//然后使用类A的类应用程序
导入com.test.helpers.*;
公共类应用程序{
公共静态void main(字符串参数[]){
A=新的A();
a、 你好;
}
}

我把这两个文件都放在一个名为“JavaTest”的目录中(在Windows7上), 首先使用命令
javac-d编译A.java。A.java

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



但问题似乎有两种解决方式,

  • 删除源文件A.java
  • import com.test.helpers.*更改导入语句
    在文件“App.java”中导入com.test.helpers.A
  • 如果你能解释一下这里发生了什么,我将不胜感激。或者我可能犯了愚蠢的人类错误或语法错误


    非常感谢

    文件A.java应该位于JavaTest\com\test\helpers\A.java路径中

    别忘了像这样编译它:
    javac-d。com\test\helpers\A.java

    将JavaTest文件夹下的A.java移动到com/test/helpers。您看到的错误是编译器抱怨A.java位于与其包声明不匹配的文件夹中。请记住,如果包中没有存在,则无法从应用访问

    从src driectory下运行以下命令编译类

    src> javac ./*.java ./com/test/helpers/*.java
    
    然后从src文件夹下

    src>java App
    

    那应该可以运行你的程序。

    我最后遇到了同样的问题

    我被解决了

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

    如果在com.test.helpers中有多于类,则可以使用导入com.test.helpers.*

    一切就绪,java不会要求将A.java文件放在helpers文件夹中

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

    正因为如此,java中有一条规则:永远不要将一个.java文件(同名)与包并行放置

    因此,要解决这个问题,您必须删除文件A.java 或者将其重命名(为包中不存在的任何其他名称)
    或者您可以使用完全限定的导入语句

    Hi。这里的问题是,由于目录中的类文件名(
    JavaTest
    以及
    com.test.helpers
    目录)不明确,JVM会混淆类文件

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

  • 删除源文件A.java
  • 当您从
    JavaTest
    中删除源文件
    A.java
    时,JVM现在知道要使用
    com.test….
    中的类文件,模糊性就消失了

  • 将文件App.java中的import语句从“import com.test.helpers.*;”更改为“import com.test.helpers.A”。
  • 在这里,您指定在类实现中使用的特定文件是告诉编译器使用
    com.test…
    中的文件
    A.java
    ,而不是
    JavaTest
    包中的文件

    现在,这种模糊性的解决方案对您来说不再是一个问题,您必须使用import语句导入特定文件,即
    import com.test.helpers.a;
    或者如果您想执行
    import com.test.helpers.*;
    则必须在cur中的任何地方使用
    com.test.helpers.a
    租用类实现告诉编译器不要将其与
    JavaTest

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

    类应用程序在默认包中,对吗?是的,我相信是这样。目录结构是这样的(在编译了A.java之后)Desktop>JavaTest-com>test>helpers>A.class-A.java-App.java感谢您花时间来创建一个loook.emmh,我看不到目录结构,但是类A应该在路径JavaTest\com\test\helpers\A.java中,是吗?抱歉,第一条注释没有清楚地显示类结构。源文件(A.java和App.java)在一个名为“JavaTest”的文件夹中.Java编译后,它的类文件出现在JavaTest>com>test>helpers中。当尝试编译App.Java时,会出现错误。如果删除了A.Java,或者App.Java中的import语句发生了更改,则可以使用显式类名替换星号,即A.Btw,谢谢您花时间查看。顺便说一句,如果您愿意的话,这是该项目的下载链接:谢谢。谢谢,效果很好。你知道为什么当App.java中的import语句从
    code
    import com.test.helpers.*;
    code
    更改为
    code
    import com.test.helpers.A;
    code
    时,错误从未出现吗?老实说,我不知道,但是我的g因为它与类加载器的内部结构有关
    //Use like this
    import com.test.helpers.A;