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

时间:2014-07-18 18:03:40

标签: java import packages

最近开始学习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 utilizing 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'。
  3. 如果你能解释这里发生的事情,我将非常感激。或者我可能会犯一个愚蠢的人为错误或语法错误。

    Here's the link to the source files

    非常感谢

6 个答案:

答案 0 :(得分:5)

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

从src driectory下面运行以下命令来编译你的类

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

然后从src文件夹下

src>java App

应该运行你的程序。

答案 1 :(得分:2)

这里的问题是,由于ambiguous类目录(JavaTest以及com.test.helpers目录)中的javac -d . A.java类文件名,JVM会混淆类文件。 / p>

当你执行com.test.helpers时,编译器在目录JavaTest中创建一个类文件,现在它将它与Deleting the Source file A.java

中的源文件混淆
  1. A.java
  2. 当您从JavaTest删除源文件com.test....时,JVM现在知道要使用Changing the import statement from 'import com.test.helpers.*;' to 'import com.test.helpers.A' in the file, 'App.java'.中的类文件,歧义消失。

    1. A.java
    2. 在这里,您要指定在类实现中使用哪个特定文件,即告诉编译器使用com.test...而不是JavaTest包import com.test.helpers.A; >

      现在,这种歧义的解决方案永远不会成为您的问题,您必须使用import语句导入特定文件,即import com.test.helpers.*;,或者如果您想要com.test.helpers.A,那么您必须专门使用A代替当前类实现中的JavaTest,告诉编译器不要将其与@Override public void onStart() { super.onStart(); FirebaseRecyclerAdapter<MyList, myListViewHolder> firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<...>( MyList.class, R.layout.my_list_row, myListViewHolder.class, mDatabase ) { @Override protected void populateViewHolder(myListViewHolder viewHolder, MyList model, int position) { viewHolder.setTitle(model.getTitle()); viewHolder.setLink(model.getLink()); viewHolder.setImage(getContext(), model.getImage()); viewHolder.mView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { } }); } }; mList.setAdapter(firebaseRecyclerAdapter); } //myList class public static class myListViewHolder extends RecyclerView.ViewHolder { View mView; public myListViewHolder(View itemView) { super(itemView); mView = itemView; } public void setImage(Context ctx, String image) { ImageView gift_image = (ImageView) mView.findViewById(R.id.listRowImageView); //Picasso.with(ctx).load(image).resize(75,75).into(test_image); Glide.with(ctx).load(image).into(test_image); }

      的源混淆

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

答案 2 :(得分:1)

文件A.java应该在路径JavaTest \ com \ test \ helpers \ A.java

并且不要忘记编译它: javac -d。 COM \测试\助手\ A.java

答案 3 :(得分:1)

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

我解决了。

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

如果你在 com.test.helpers 中有一个以上的课程,那么你可以使用 import com.test.helpers。*;

答案 4 :(得分:1)

每件事都在正确的位置,java不要求把你的A.java文件放在helpers文件夹中

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

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

并行放置

所以要解决这个问题,你必须删除文件A.java 或重命名它(到包中没有的任何其他名称) 或者您可以使用完全限定的导入声明

答案 5 :(得分:0)

如果您没有使用带有 auto-save 的编辑器,检查您编写的代码是否确实已保存到先前创建的 java 文件中可能会有所帮助