javac 不显示编译器错误?

标签 java windows compiler-errors javac

我正在教我的 friend 一些 Java,我们在尝试在她的 Hello World 程序上运行编译器时遇到了问题。该代码有一个非常明显的错误(Sysrem.out.println),但在其他方面是完全有效的 Java,但由于某种原因编译器没有报告该错误。这是发生的事情:

  1. 当我们在 Windows 命令提示符中运行 javac Hello.java 时,它打印出一个空行,然后打印一个新的命令提示符行,就好像操作已成功,但显然没有 -没有创建类文件,当然代码有错误,所以我们知道它不会成功。
  2. 当我们运行javac -verbose Hello.java时,它打印出了正在加载的类文件的血腥细节,但仅此而已。虽然它最后没有说它已经编写了一个类文件,但它也没有打印出错误。
  3. 修复错误后,程序编译并运行没有问题,因此 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/

相关文章:

.net - 使用 @Html.ActionLink() 时出错

windows - C++/CX 迭代 Map<String^, Object^>^ 的方式?

c - 基本语法错误无法修复?

java - 如何使用按钮作为 double 据类型将JTextField输入存储为变量?

java - Java 程序中 SSLKEYLOGFILE 的等价物是什么?

c - 有没有办法检查(文件)句柄是否有效?

windows - Windows 中供应商的 OpenGL 驱动程序在哪里?

java - 为 Java 8 上的 Tomcat 8.5 分配更多内存

java - Redis 缓存 Map<Integer, String>

java - itext java pdf 到文本创建