【问题标题】:javac not displaying compiler errors?javac不显示编译器错误?
【发布时间】:2018-05-19 05:33:07
【问题描述】:

我正在教我的朋友一些 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>

【问题讨论】:

  • 显示代码..
  • Sysrem 应该是 System.
  • @ShanuGupta 刚刚添加了代码。我知道代码中的问题是什么,但我不知道为什么编译器没有按预期打印出错误。
  • 您的完整代码看起来不错,但您没有在其中使用Sysrem。 Javac 只是在编译它。
  • 安装了 Window JDK 的人可以尝试重现此行为吗?我很难相信 javac 会这样做......除非你做了一些事情来重定向或抑制编译错误消息。

标签: java windows compiler-errors javac


【解决方案1】:

这实际上归结为一个空文件是否是一个有效的 Java 程序。令人惊讶的是!

这是 CompilationUnit 的语法 ...这是 JLS 用于 Java 源文件的技术术语:

CompilationUnit:
   OrdinaryCompilationUnit
   ModularCompilationUnit

OrdinaryCompilationUnit:
   [PackageDeclaration] {ImportDeclaration} {TypeDeclaration}

ModularCompilationUnit:
   {ImportDeclaration} ModuleDeclaration

(参考:JLS 7.3

请注意,OrdinaryCompilationUnit 元素允许您拥有包含以下内容的源文件:

  • 无包装声明
  • 没有导入语句
  • 没有类型声明

换句话说,一个空文件,或者一个只包含 cmets 的文件。

简而言之,如果你告诉javac 编译一个空文件,它不会产生任何编译错误……因为它是“有效”的Java 源代码文件。

【讨论】:

    【解决方案2】:

    好吧,我发现了这个问题:原来我的朋友在创建文件后从未在她的文件上点击“保存”,而我假设这只是一些设计不直观的预期行为,javac 不会抱怨正在输入一个空白文件!

    这正是发生的事情:

    • 创建文件
    • 编写错误代码但不要保存文件
    • 尝试编译代码并解决我的问题中描述的问题
    • 更正代码中的错误并保存文件
    • 编译和运行代码没有问题

    【讨论】:

    • 你可能想补充一点,也许一个“好的”做法是在命令行上使用type Hello.java(或Linux上的cat Hello.java)来确保文件确实具有预期的内容。
    猜你喜欢
    • 1970-01-01
    • 2014-06-29
    • 1970-01-01
    • 2012-01-14
    • 1970-01-01
    • 2017-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多