我想从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块。 谢谢!提前!!
答案 0 :(得分:1)
我的猜测(我不知道你的工具集)是你的“访客”是集体走在树上,“访问(IfStmt ..)”返回“false”导致树步行中止当if语句树节点被启用时。
这会阻止递归到嵌套“try”子句隐藏的“if”的子部分。
尝试使“vist(IfStmt ...)”返回“true”(可能需要调用其子项的访问权限?)。