【问题标题】:Why it complains when I import a self-defined package like below?为什么当我像下面这样导入自定义包时它会抱怨?
【发布时间】:2017-08-14 12:42:47
【问题描述】:

我已经构建了两个名为 PackageTest.java(在桌面目录中)和 Employee.java(在桌面/com/wenhu/corejava 目录中)的类。

在Employee.java文件中,我在第一行写了:

package com.wenhu.corejava;

然后在PackageTest.java文件中,我在第一行写了:

import com.wenhu.corejava.*;

但是,编译器抱怨:

    PackageTest.java:8: error: cannot access Employee
        Employee harry = new Employee("Harry", 50000, 1989, 10, 1);
        ^
  bad class file: .\Employee.class
    class file contains wrong class: com.wenhu.corejava.Employee
    Please remove or make sure it appears in the correct subdirectory of the classpath.
1 error

有趣的是,如果我写了:

import com.wenhu.corejava.Employee;

编译器没问题! 谁能告诉我为什么会这样?我虽然通配符 * 可以代表 Employee Class...

非常感谢!

【问题讨论】:

  • "类文件包含错误的类:com.wenhu.corejava.Employee 请删除或确保它出现在类路径的正确子目录中。" 你搞砸了你的项目结构体。确保Employee.javacom/wenhu/corejava 目录中

标签: java


【解决方案1】:

简单:

错误的类文件:.\Employee.class

类文件包含错误的类:com.wenhu.corejava.Employee

您的设置有些混乱。您的 current 目录中似乎有一个 Employee 类文件。

类文件中的包名必须与文件系统位置匹配!

【讨论】:

  • 哈哈,我想喝一大杯啤酒,我在当前目录中找到了那只老鼠,非常感谢你回答我的菜鸟问题......它有很大帮助!!!
  • 当然。并记录在案:请不要忘记接受其中一个答案。
  • 哦,还有一个问题。为什么在我导入包括 Employee 在内的整个路径之后它变成正确的,比如 import com.wenhu.corejava.Employee;为什么这次编译器没有名字混淆,连我当前目录下还有老鼠?
  • 我不得不承认:我不能说。我们会完全了解您设置的所有方面。比如类路径设置,文件夹结构,...
  • import com.wenhu.corejava.Employee 的情况有效,因为这是一个“单一类型导入”,它隐藏了当前包的 Employee 类。通配符导入(按需类型导入)不会影响当前包的类Employee。请参阅 JLS 关于阴影的规则:docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.3
【解决方案2】:
package com.wenhu.corejava;

Employee 类中的这条语句意味着你的类文件Employee.java 必须位于目录com/wenhu/corejava/ 中。但在您的情况下,它位于您的 java 编译器作为所有源的根目录可以理解的目录中,即default package

要解决您的问题,请删除上面提到的包声明which is not recommended,或者创建相应的目录并将源文件Employee.java 移至该目录。

【讨论】:

    猜你喜欢
    • 2014-06-24
    • 1970-01-01
    • 2012-06-13
    • 1970-01-01
    • 2020-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多