javac没有显示编译器错误?

时间:2018-05-19 05:33:07

标签: java windows compiler-errors javac

我教我的朋友一些Java,我们遇到了试图在她的Hello World程序上运行编译器的问题。代码有一个非常明显的错误(ZYNQ_TRM),但其他方面是完全有效的Java,但由于某种原因,编译器没有报告错误。这里发生了什么:

  1. 当我们在Windows命令提示符中运行Sysrem.out.println时,它打印出一个空白行,然后是一个新的命令提示行,就好像操作已成功,但它显然没有 - 类文件不是& #39; t创建,当然代码有错误,所以我们知道它不会成功。
  2. 当我们运行javac Hello.java时,它打印出它正在加载的类文件的血腥细节,但那就是它。虽然它并没有说它写了一个类文件,但它也没有打印出错误。
  3. 我们修复了错误后,程序编译并运行没有问题,所以看起来javac似乎不喜欢打印出编译错误。
  4. 这里可能会发生什么,为什么编译器报告此错误的原因并非如此?

    完整的代码:

    javac -verbose Hello.java

    命令提示符:

    public class Hello {
    
        public static void main(String[] args) {
            Sysrem.out.println("Hello, world!");
        }
    
    }
    

2 个答案:

答案 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源代码文件。