当前位置: 首页 > 面试题库 >

Java中的语法检查

刘玉石
2023-03-14
问题内容

我目前正在开发一个带有嵌入式文本编辑器的程序。用户应该在编辑器中键入Java代码。然后,将输入编辑器中的代码制成字符串。我只想要一些可以检查缺少括号的内容或不带钩子的尝试,等等。它不需要编译。我已经看了很多遍,但是我还是编程新手,无法实现一些较难的东西。

因此,使其更简短:我正在寻找一些Java软件包,该软件包将分析代码中的语法错误。


问题答案:

从Java
6开始,您可以使用JavaCompiler编译文本并取回Diagnostic对象,这些对象将告诉您文件有什么问题(如果有)。因此,对于您的示例,您需要获取编辑器的内容并将其传递给JavaCompiler,运行它,并报告所有问题。以下示例假定将编辑器文本写到文件中。

示例代码:

档案检查

public class HelloBuggyWorld {
    String test // missing a semicolon

    public static void main (String [] args) {
        System.out.println('Hello World!');  // should be double quoted
    }
}

检查器

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Formatter;
import java.util.List;
import java.util.Locale;

import javax.tools.Diagnostic;
import javax.tools.DiagnosticCollector;
import javax.tools.JavaCompiler;
import javax.tools.JavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;

public class JavaSyntaxChecker {
    public static void main(String[] args) {
        System.out.println(JavaSyntaxChecker.check("/path/to/HelloBuggyWorld.java"));
    }

    public static List<String> check(String file) {
        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

        StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
        Iterable<? extends JavaFileObject> compilationUnits =
                fileManager.getJavaFileObjectsFromStrings(Arrays.asList(file));

        DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<JavaFileObject>();
        compiler.getTask(null, fileManager, diagnostics, null, null, compilationUnits).call();

        List<String> messages = new ArrayList<String>();
        Formatter formatter = new Formatter();
        for (Diagnostic diagnostic : diagnostics.getDiagnostics()) {
            messages.add(diagnostic.getKind() + ":\t Line [" + diagnostic.getLineNumber() + "] \t Position [" + diagnostic.getPosition() + "]\t" + diagnostic.getMessage(Locale.ROOT) + "\n");
        }

        return messages;
    }
}

输出量

从运行main方法。

[ERROR:  Line [5]    Position [124] HelloBuggyWorld.java:5: unclosed character literal
, ERROR:     Line [5]    Position [126] HelloBuggyWorld.java:5: ';' expected
, ERROR:     Line [5]    Position [131] HelloBuggyWorld.java:5: not a statement
, ERROR:     Line [5]    Position [136] HelloBuggyWorld.java:5: ';' expected
, ERROR:     Line [5]    Position [137] HelloBuggyWorld.java:5: unclosed character literal
]


 类似资料:
  • 例子 $ cat foo.c union u { char c; int i; } $ gcc -fsyntax-only foo.c foo.c:4:1: error: expected identifier or ‘(’ at end of input 技巧 如上所示,使用-fsyntax-only选项可以只做语法检查,不进行实际的编译输出。 详情参见 gcc手册

  • 问题内容: 这是我的解释,它是类模板,但是类?表示该类的名称不确定,并且扩展了Something类。 如果我的解释有问题,请告诉我。 问题答案: 你说的差不多。基本上,Java没有模板的概念(C ++有)。这称为泛型。这就定义了一个通用类,其通用属性是的任何子类。 如果您想了解模板和泛型之间的区别,建议阅读“ C++和Java中“泛型”类型之间有什么区别? ”。

  • 问题内容: 我一直在尝试找出如何检查XML文件的语法,确保所有标签均已关闭,没有随机字符等。目前,我所关心的是确保在XML文件中没有损坏的XML。文件。 …但是我意识到我不想验证XML文件的结构;我 不想 针对XML Schema(XSD) 进行 验证…我只想检查XML语法并确定它是否正确。 问题答案: 您可以检查是否是一个XML文档 格式良好的 使用下面的代码: 上面的代码中引用的类如下: 这来

  • 问题内容: 在Java中,我了解到以下语法可用于提及键盘上没有的Unicode字符(例如,非ASCII字符): 我的问题是:以上语法中(u)*的目的是什么? 我理解的一个用Java表示日元符号的用例是: 问题答案: 有趣的问题。JSL的3.3节说: 转化为 和 如果合格的\后跟u,或不止一个u,并且最后一个u后不跟四个十六进制数字,则发生编译时错误。 因此,您是对的,反斜杠后可以有一个或多个。原因

  • 本文向大家介绍Java语言中的Kruskal算法,包括了Java语言中的Kruskal算法的使用技巧和注意事项,需要的朋友参考一下 Kruskal算法是一种贪婪算法,其工作原理如下: 1.它在图形中创建一组所有边。 2.虽然上述集合不是空的,并且并非所有顶点都被覆盖, 它从该组中删除最小重量边 它检查此边缘是形成一个循环还是仅连接2棵树。如果形成一个循环,则丢弃该边,否则将其添加到树中。 3.完成

  • 我面临的问题是在java中使用hibernate为postgres表执行以下查询。 该查询由使用内部连接从3个表中检索数据组成。 QryJourney=“选择journey.id、journey.operatingday、journey.linename、journey.scheduledeparturestopname、journeydetail.stopname、journeydetail.l