【问题标题】:javaparser - Lexical error Encountered: <EOF> after : ""javaparser - 遇到词法错误:<EOF> after : ""
【发布时间】:2016-11-25 04:45:39
【问题描述】:

我正在使用这个 javaparser https://github.com/javaparser/javaparser 来解析一些 github 用户的大量 java 源代码以从中进行一些统计(这是针对大学项目的)。一切似乎都运行良好,但在某些时候,特定的源代码会产生此错误:

Exception in thread "main" com.github.javaparser.TokenMgrError: Lexical error at line 6, column 2.  Encountered: <EOF> after : ""

这是该文件中所写的内容:

public class Test {
    /**<caret>
    public void foo() {
    }
}

这是我解析文件的方式:

...

new NodeIterator(new NodeIterator.NodeHandler() {
    @Override
    public boolean handle(Node node) {
        ...
    };
}).explore(JavaParser.parse(file));

...

这是 NodeIterator 类:

public class NodeIterator {
    public interface NodeHandler {
        boolean handle(Node node);
    }

    private NodeHandler nodeHandler;

    public NodeIterator(NodeHandler nodeHandler) {
        this.nodeHandler = nodeHandler;
    }

    public void explore(Node node) {
        if (nodeHandler.handle(node)) {
            for (Node child : node.getChildrenNodes()) {
                explore(child);
            }
        }
    }
}

我已经理解了这个问题,但是这个问题停止了整个解析。我有很多文件要在 for 中解析,那么 如何才能继续解析其他文件?或者是否有一个工具可以在解析之前检查 java 文件是否“写得好”?

【问题讨论】:

    标签: java exception eof lexical javaparser


    【解决方案1】:

    你不能解决“问题”,因为它不是问题。错误是正确的,因为您尝试解析的源代码不正确。它有一个在文件结尾之前没有终止的注释。

    如果您使用javac 编译相同的源代码,您也会收到错误消息。它比你的javaparser 更详细,但它仍然是一个错误,因为你试图解析的源有这个错误。

    Javac 输出:

    Test.java:2: error: unclosed comment
        /**<caret>
        ^
    Test.java:6: error: reached end of file while parsing
    2 errors
    

    【讨论】:

    • 那么,有没有办法检查我正在解析的文件是否写得好或跳过错误继续解析?
    • 看起来这个库在令牌解析错误后没有恢复功能,并且无论如何在令牌化时遇到文件末尾都很难恢复。您最好的选择是忽略文件的其余部分或整个文件。
    • 我的问题是我正在解析很多文件并且每个错误都会阻止整个解析,所以你知道如何继续解析其余文件,或者可能是一个检查是否文件是否“写得好”?
    猜你喜欢
    • 2017-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-18
    • 1970-01-01
    • 1970-01-01
    • 2019-10-20
    • 2019-08-15
    相关资源
    最近更新 更多