为什么IntelliJ可以检测到缺失的分号,而Java编译器可以';T

为什么IntelliJ可以检测到缺失的分号,而Java编译器可以';T,java,intellij-idea,compiler-construction,Java,Intellij Idea,Compiler Construction,我想知道为什么会这样。IntelliJ如何以及为什么能够检测到缺失的分号,而Java编译器却不能?是否存在IntelliJ错误且无法实际检测缺失分号的情况? 我读过类似的问题,讨论C和C++,有指针使事情复杂化,但是java在这方面似乎更简单。p> 我想挑战您的前提,即Java编译器无法检测缺少的分号。我刚刚尝试使用Oracle JDK 8中的javac编译以下代码,它完全能够检测到缺少的分号: public class Test { public static void main(Stri

我想知道为什么会这样。IntelliJ如何以及为什么能够检测到缺失的分号,而Java编译器却不能?是否存在IntelliJ错误且无法实际检测缺失分号的情况?
我读过类似的问题,讨论C和C++,有指针使事情复杂化,但是java在这方面似乎更简单。p> 我想挑战您的前提,即Java编译器无法检测缺少的分号。我刚刚尝试使用Oracle JDK 8中的
javac
编译以下代码,它完全能够检测到缺少的分号:

public class Test {
  public static void main(String... args) {
    System.out.println()
  }
}
打印的编译器错误如下所示:

Test.java:3: error: ';' expected
    System.out.println()
                        ^
1 error

正如您所看到的,它不仅检测到丢失的分号,甚至能够准确指出它丢失的位置。

Java编译器以什么方式不能检测到丢失的分号?如果它们丢失,代码将无法编译…@ElliottFrisch好吧,编译器可以告诉你“;”丢失。。。如果java编译器能够检测到它,为什么我们需要使用它们?为什么我们需要使用java编译器来编译java?因为JVM运行Java字节码,它是由……等待它……编译器生成的!您没有提供任何证据表明Java编译器无法检测到丢失的分号。添加缺少分号且仍能编译的代码。在所有Turtle的底部,IDEA还使用编译器api验证代码。例如,它完美地复制了罕见的编译器错误,是吗?我的印象是IDEA实际上有自己的编译器基础设施,这就是为什么它们有时在新的语言功能方面稍显滞后的原因,也是为什么将Java代码粘贴到Scala源文件中并自动转换为Scala代码这样的强大功能能够工作的原因。他们有一个集成的“IDE编译器”,具有一个集成的、跨语言的语义树表示和不同的前端。(我相信这和JetBrains MPS的技术是一样的。)或者我完全错了吗?不,我不认为你错了,我只是得到了一个额外的印象,那就是如果可以的话,它们会走得更远,因为事实上它们与bug完美匹配。现在我想知道我是否完全错了,让我试着挖掘一个具体的案例。他们确实使用平台编译器生成代码(除了Kotlin,在Kotlin中IDE编译器和平台编译器是同一个)。也许你就是这么想的?或者,实际上,他们使用IDE编译器进行在线分析(语法突出显示、语义突出显示、自动完成、快速修复、重构、内联文档、红色曲线等),使用平台编译器生成代码,并且他们可能将这两种编译器都用于静态分析。我认为这是正确的说法。我在想这样的奇怪案例,所以,对我来说,这似乎相当奇怪的想法正好复制了这一点。当我看到这一点时,我认为他们正在做一些超越“洁净室”编译器前端的事情(正如你所说,这是他们多年来IDE技术的核心)