在Java代码中提取嵌套的Catch块

时间:2014-08-30 04:59:04

标签: java parsing abstract-syntax-tree

我想从java代码中提取所有catch块。我能够提取正常的try-catch块,但是如果catch块嵌套在一些其他类型的块中,例如“if”,我的代码就是能够检测到它们。

以下是我使用AST解析器编写的代码:

public static void methodVisitor(String content)
{
    ASTParser metparse = ASTParser.newParser(AST.JLS3);
    metparse.setSource(content.toCharArray());
    metparse.setKind(ASTParser.K_STATEMENTS);
    Block block = (Block) metparse.createAST(null);

    block.accept(new ASTVisitor()
    {
        public boolean visit(VariableDeclarationFragment var)
        {
            return false;
        }

        public boolean visit(SimpleName node)
        {
            return false;
        }

        public boolean visit(IfStatement myif)
        {
            System.out.println("myif=" + myif.toString());
            return false;
        }

        public boolean visit(TryStatement mytry)
        {
            System.out.println("mytry=" + mytry.toString());
            List catchClauses = mytry.catchClauses();

            CatchClause clause = (CatchClause) catchClauses.get(0);
            SingleVariableDeclaration exception = clause.getException();
            Type type = exception.getType();

            System.out.println("catch=" + catchClauses.toString());

            return false;
        }

        public boolean visit(CatchClause mycatch)
        {
            System.out.println("mycatch=" + mycatch.toString());
            return false;
        }
    });
}

此代码无法在以下条件中提取catch子句:

if (base != null && base.getClass().isArray())
{
    context.setPropertyResolved(base, property);
    try
    {
        int idx = coerce(property);
        checkBounds(base, idx);
    }
    catch (IllegalArgumentException e)
    {
    }
}

有谁知道如何提取嵌套的catch块。 谢谢!提前!!

1 个答案:

答案 0 :(得分:1)

我的猜测(我不知道你的工具集)是你的“访客”是集体走在树上,“访问(IfStmt ..)”返回“false”导致树步行中止当if语句树节点被启用时。

这会阻止递归到嵌套“try”子句隐藏的“if”的子部分。

尝试使“vist(IfStmt ...)”返回“true”(可能需要调用其子项的访问权限?)。