Java AST分析:在匿名方法中无法识别Catch子句

Java AST分析:在匿名方法中无法识别Catch子句,java,abstract-syntax-tree,Java,Abstract Syntax Tree,我有以下代码: public class TestClass2 { public void test() { new Button().addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { try { } catch

我有以下代码:

public class TestClass2 {

    public void test() {

        new Button().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {

                try {

                } catch (Exception e1) {

                } 

            }
        });

        try {

        } catch (Exception e2) {

        } 

    }

}
我使用ASTVisitor对象解析此代码,并重写VISITCACHCLAUSE方法:

 @Override
   public boolean visit(CatchClause node) {
      //some code here
      return true;
   }
对于对象e2的异常调用此方法,但对于匿名类内的异常,永远不会调用此方法。我不知道为什么。我应该换什么

匿名类的解析如下所示:

public boolean visit(AnonymousClassDeclaration node) {
   System.out.println("anonymous class");
   return true;
}
以下是重现该问题的完整工作示例:

import org.eclipse.jdt.core.dom.AST;
import org.eclipse.jdt.core.dom.ASTParser;
import org.eclipse.jdt.core.dom.ASTVisitor;
import org.eclipse.jdt.core.dom.AnonymousClassDeclaration;
import org.eclipse.jdt.core.dom.Assignment;
import org.eclipse.jdt.core.dom.CatchClause;
import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.jdt.core.dom.ConditionalExpression;
import org.eclipse.jdt.core.dom.DoStatement;
import org.eclipse.jdt.core.dom.EnhancedForStatement;
import org.eclipse.jdt.core.dom.EnumDeclaration;
import org.eclipse.jdt.core.dom.FieldAccess;
import org.eclipse.jdt.core.dom.FieldDeclaration;
import org.eclipse.jdt.core.dom.ForStatement;
import org.eclipse.jdt.core.dom.ITypeBinding;
import org.eclipse.jdt.core.dom.IfStatement;
import org.eclipse.jdt.core.dom.ImportDeclaration;
import org.eclipse.jdt.core.dom.MethodDeclaration;
import org.eclipse.jdt.core.dom.MethodInvocation;
import org.eclipse.jdt.core.dom.PackageDeclaration;
import org.eclipse.jdt.core.dom.SwitchStatement;
import org.eclipse.jdt.core.dom.TypeDeclaration;
import org.eclipse.jdt.core.dom.VariableDeclarationFragment;
import org.eclipse.jdt.core.dom.WhileStatement;

public class Test {
    public static void main(String args[]){
        ASTParser parser = ASTParser.newParser(AST.JLS4);
        parser.setSource("package testpackage; import java.awt.Button; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class TestClass2 { public void test() { new Button().addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { try { } catch (Exception e1) { } } }); try { } catch (Exception e2) { } } }".toCharArray());

        parser.setKind(ASTParser.K_COMPILATION_UNIT);
        parser.setStatementsRecovery(true);
        parser.setResolveBindings(true);
        final CompilationUnit compilationUnit = (CompilationUnit) parser.createAST(null);
        compilationUnit.accept(new ASTVisitor() {

            @Override
            public boolean visit(TypeDeclaration node) {

                return true;
            }

            @Override
            public boolean visit(MethodDeclaration node) {

                return true;
            }

            @Override
            public boolean visit(ImportDeclaration node) {

                return false;
            }

            @Override
            public boolean visit(AnonymousClassDeclaration node) {

                return true;
            }

            @Override
            public boolean visit(Assignment node) {

                return false;
            }

            @Override
            public boolean visit(CatchClause node) {
                System.out.println(node);
                return true;
            }

            @Override
            public boolean visit(ConditionalExpression node) {

                return true;
            }

            @Override
            public boolean visit(DoStatement node) {

                return true;
            }

            @Override
            public boolean visit(EnhancedForStatement node) {

                return true;
            }

            @Override
            public boolean visit(EnumDeclaration node) {

                return false;
            }

            @Override
            public boolean visit(FieldDeclaration node) {

                return false;
            }

            @Override
            public boolean visit(ForStatement node) {

                return true;
            }

            @Override
            public boolean visit(IfStatement node) {

                return true;
            }

            @Override
            public boolean visit(MethodInvocation node) {

                return false;
            }

            @Override
            public boolean visit(PackageDeclaration node) {

                return false;
            }

            @Override
            public boolean visit(SwitchStatement node) {

                return true;
            }

            @Override
            public boolean visit(WhileStatement node) {

                return true;
            }

            @Override
            public boolean visit(FieldAccess node) {

                return false;
            }

        });

    }
}

当您通过覆盖ASTParser上的visit方法捕获任何节点时,应该显式地访问它们,这是因为您没有访问方法调用addActionListener

将visitMethodInvocation节点更改为返回true

public boolean visit(MethodInvocation node) {

    return true;
}

向我们展示您如何在匿名类上运行代码。@SotiriosDelimanolis谢谢,我添加了代码OK,这不是我的意思。请发布一个完整且可复制的解析代码示例,以便我们可以尝试查看它是否未被调用。@SotiriosDelimanolis Ok,添加了一个!