Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中一次获得所有编译时错误?_Java_Java 8 - Fatal编程技术网

如何在Java中一次获得所有编译时错误?

如何在Java中一次获得所有编译时错误?,java,java-8,Java,Java 8,我想编译一个java文件,并将所有错误记录到列表中。到目前为止,我正在使用java的内置编译器API,但它有一些问题 比如说, //demo.java 课堂演示 { 公共静态无效字符串[]args{ 整数数组=新整数[10] } } 我们可以看到缺少分号和[]数组括号。 但是Java编译器API将只返回 java:4:错误:';'预期 整数数组=新整数[10] ^ 1错误 但应该说缺少[]括号和分号 是否有其他方法编译java文件并返回所有错误 如果有任何方法可以使用Java编译器API实现,请

我想编译一个java文件,并将所有错误记录到列表中。到目前为止,我正在使用java的内置编译器API,但它有一些问题

比如说,

//demo.java 课堂演示 { 公共静态无效字符串[]args{ 整数数组=新整数[10] } } 我们可以看到缺少分号和[]数组括号。 但是Java编译器API将只返回

java:4:错误:';'预期 整数数组=新整数[10] ^ 1错误 但应该说缺少[]括号和分号

是否有其他方法编译java文件并返回所有错误

如果有任何方法可以使用Java编译器API实现,请告诉我

如果有任何其他外部库或工具编译java文件并返回错误状态。 外部图书馆应:

如果文件没有错误,那么库应该说该文件没有错误。 如果Java文件有一些错误,那么库应该返回错误列表及其行号和错误消息。
我搜索了很多关于这个网站的信息。但只找到了一个解决方案,即Java编译器API。但是我也想试试其他的工具。

这是不可能的。Java编译器在遇到错误时停止处理源文件。C/C++编译器可以执行您想要的操作,但是下面的大多数错误消息都是误导性的,没有用处


要获得所有错误的列表,编译器需要使用AI技术。编译器需要猜测您的意思。

Java编译器不会警告您缺少[],因为Java编译器永远不会发出这种错误;如果修复此代码中缺少的分号(这是一个语法错误),则报告的错误为:

不兼容的类型:int[]无法转换为int 这是一个错误,因为变量的类型声明为int,但初始值设定项的表达式的类型为int[]

通过将错误描述为missing[],听起来像是另一个语法错误,但实际上不兼容的类型错误不是语法错误;它发生在这个阶段,而这个阶段发生在之后。但是,如果在解析阶段出现任何语法错误,那么编译器不会进入类型检查阶段,因为没有有效的解析树进行类型检查


因此,Java编译器不会在同一个编译单元中同时报告语法错误和类型错误,无论您使用的是命令行javac工具还是编译器API。

有没有使用编译器解析器或语言处理工具的方法?这是错误的;Java编译器不会在出现第一个错误时停止处理。尝试编译类A{A;b;},您将得到两个语法错误,而不是一个。是的@kaya3是正确的!编译器在发现任何错误时都不会停止。然而,编译通常发生在“阶段”中,一个阶段中足够严重的错误会使运行下一阶段变得毫无意义,因此,不可能报告下一阶段将发现的错误。但这可以使用任何外部工具或任何库来完成吗?这正是我要问的吗?@kaya3这不是它的工作方式。规范定义了什么是正确的程序。因此,所有的编译器都应该同意什么是正确的程序,什么是不正确的程序,但当涉及到报告错误时,他们进入了解释的领域,猜测作者犯了什么错误。这个报告可能会有很大的不同,在我看来,所有当前的编译器在这方面都会失败。一个原因是他们确实在尝试OP想要的,当上下文由于以前的错误而不可靠时,他们会报告额外的错误。我刚刚检查了这一点:Eclipse的后端编译器ecj确实会同时报告一个缺少的分号和一个类型不匹配,但还有第三个错误,“insert ArrayInitializer to complete Expression”,这说明了问题所在:我们知道代码与官方语法不匹配,但我们不知道缺少什么,因为这意味着猜测程序员的意图。过去,编译器经常在这个代码位置说“}意外”,这也没有什么帮助。@kaya3有类似“如果X动词Y是编译时错误”的语句,但它仍然没有说编译器的错误消息必须是这样的。在某些情况下确实如此,但在许多情况下,错误消息的读取方式仍然不同。正式声明所暗示的是,不允许在没有错误的情况下编译“X动词Y”。在语法错误的情况下,在规范中找不到这样的语句。只有一个正式的语法。如前所述,这个问题的具体示例已经允许至少两条我看到至少三条不同的错误消息。起点是OP希望编译器同时告诉这两条消息,即缺少的分号和类型不匹配,如前所述,Eclipse的编译器会这样做。加 另一个错误。所以你声称所有编译器都报告相同的错误是错误的。这些都在规格范围内。规范规定,这个错误的程序不会被编译,但至少会产生一条错误消息。如果编译器只对每种错误说“至少有一个错误必须修复”,而没有任何额外的细节,这将是完全合法的。细节不是强制性的