最近为了考试开始学习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
然后,当尝试编译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
然而,这个问题似乎有两种解决方法,
- 删除源文件A.java
- 将文件
App.java
中的导入语句从import com.test.helpers.*;
更改为import com.test.helpers.A
。
如果你能解释一下这里发生了什么,我将非常感激。或者我可能犯了一个愚蠢的人为错误或语法错误。
这是到源文件的链接
嗨,这里的问题是JVM混淆了类文件,因为两个目录(JavaTest
和com.test.helpers
目录)中的ambiguous
类文件名。
当你执行javac -d . A.java
时,编译器在com.test.helpers
目录下生成一个类文件,现在它将其与JavaTest
中的源文件混淆了
-
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中有多于一个的类。
如果您没有使用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中需要的特定导入