从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]



