我正在教我的 friend 一些 Java,我们在尝试在她的 Hello World 程序上运行编译器时遇到了问题。该代码有一个非常明显的错误(Sysrem.out.println
),但在其他方面是完全有效的 Java,但由于某种原因编译器没有报告该错误。这是发生的事情:
- 当我们在 Windows 命令提示符中运行
javac Hello.java
时,它打印出一个空行,然后打印一个新的命令提示符行,就好像操作已成功,但显然没有 -没有创建类文件,当然代码有错误,所以我们知道它不会成功。 - 当我们运行
javac -verbose Hello.java
时,它打印出了正在加载的类文件的血腥细节,但仅此而已。虽然它最后没有说它已经编写了一个类文件,但它也没有打印出错误。 - 修复错误后,程序编译并运行没有问题,因此 javac 似乎只是不喜欢打印编译器错误。
这里可能发生了什么,为什么编译器没有像应有的那样报告此错误?
完整代码:
public class Hello {
public static void main(String[] args) {
Sysrem.out.println("Hello, world!");
}
}
命令提示符:
C:\Users\MyFriendsName\Documents>javac Hello.java
C:\Users\MyFriendsName\Documents>
最佳答案
这实际上归结为空文件是否是有效的 Java 程序。令人惊讶的是,确实如此!
以下是 CompilationUnit
的语法...这是 JLS 用于 Java 源文件的技术术语:
CompilationUnit:
OrdinaryCompilationUnit
ModularCompilationUnit
OrdinaryCompilationUnit:
[PackageDeclaration] {ImportDeclaration} {TypeDeclaration}
ModularCompilationUnit:
{ImportDeclaration} ModuleDeclaration
(引用:JLS 7.3)
请注意,OrdinaryCompilationUnit
元素允许您拥有一个包含以下内容的源文件:
- 没有包声明
- 无导入声明
- 没有类型声明
换句话说,一个空文件,或一个仅包含注释的文件。
简而言之,如果您告诉 javac
编译一个空文件,它不会产生任何编译错误...因为它是“有效”的 Java 源代码文件。
关于javac 不显示编译器错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50422133/