0

我有以下目录结构:

A.java
a
└── A.java

A.java:

import a.*;

class A {
    public static void main(String[] args) {
        System.out.println("Hello Human");
    }
}

a/A.java:

package a;
public class A {}

它编译并运行:

$ javac A.java && java A
Hello Human

但是当我删除a/A.java(但保留文件夹a)时,我无法再编译它:

$ rm a/A.java 
$ javac A.java && java A
A.java:1: package a does not exist
import a.*;
^
1 error

为什么?

4

2 回答 2

5

你可能会说这个包a是不可观察的:

一个包是可观察的当且仅当:

  • 包含包声明的编译单元是可观察的(第 7.3 节)。

  • 包的子包是可观察的。

来源:包的可观察性

于 2013-04-02T14:03:40.647 回答
3

这是您的问题:

导入一个。*;

它正在寻找不存在的东西,因为该包不再存在。

从 A.java 中删除该行,它应该可以正常工作。

它找不到包的原因是因为文件夹中没有可编译的类,所以它不被识别为java包。

如果确实需要,创建空包的一种选择是指定一个 package-info.java 文件,该文件通常用作包的 javadoc。

于 2013-04-02T13:56:19.597 回答