我教我的朋友一些Java,我们遇到了试图在她的Hello World程序上运行编译器的问题。代码有一个非常明显的错误(ZYNQ_TRM
),但其他方面是完全有效的Java,但由于某种原因,编译器没有报告错误。这里发生了什么:
Sysrem.out.println
时,它打印出一个空白行,然后是一个新的命令提示行,就好像操作已成功,但它显然没有 - 类文件不是& #39; t创建,当然代码有错误,所以我们知道它不会成功。javac Hello.java
时,它打印出它正在加载的类文件的血腥细节,但那就是它。虽然它并没有说它写了一个类文件,但它也没有打印出错误。这里可能会发生什么,为什么编译器报告此错误的原因并非如此?
完整的代码:
javac -verbose Hello.java
命令提示符:
public class Hello {
public static void main(String[] args) {
Sysrem.out.println("Hello, world!");
}
}
答案 0 :(得分:0)
好吧,我发现了这个问题:原来我的朋友在创建它之后从来没有在她的文件上点击Save,并且在我假设的只是一些不直观设计的预期行为, javac不会抱怨喂一个空白文件!
以下是发生的事情:
答案 1 :(得分:0)
这实际上归结为空文件是否是有效的Java程序。令人惊讶的是,它是!
以下是CompilationUnit
的语法...这是JLS用于Java源文件的技术术语:
CompilationUnit:
OrdinaryCompilationUnit
ModularCompilationUnit
OrdinaryCompilationUnit:
[PackageDeclaration] {ImportDeclaration} {TypeDeclaration}
ModularCompilationUnit:
{ImportDeclaration} ModuleDeclaration
(参考:JLS 7.3)
请注意,OrdinaryCompilationUnit
元素允许您拥有包含以下内容的源文件:
换句话说,一个空文件或一个只包含注释的文件。
简而言之,如果你告诉javac
编译一个空文件,它就不会产生任何编译错误......因为它是“有效的”Java源代码文件。