最近开始学习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
然而,问题似乎有两种解决方法,
如果你能解释这里发生的事情,我将非常感激。或者我可能会犯一个愚蠢的人为错误或语法错误。
Here's the link to the source files
非常感谢
答案 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
A.java
当您从JavaTest
删除源文件com.test....
时,JVM现在知道要使用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.*;
,或者如果您想要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
文件中可能会有所帮助