2014-08-30 2 views
2

Я хочу извлечь все блоки catch из java-кода. Я могу извлечь нормальный блок try-catch, но если блоки catch будут вложены в некоторые другие типы блоков, такие как «if», мой код сможет их обнаружить.Извлечение вложенных блоков Catch в код Java

Ниже приводится код, который я написал, используя 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; 
     } 
    }); 
} 

Этот код не может извлечь пункт улова в следующих условиях:

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

ли кто-нибудь знает, как извлечь вложенное улов блоки. Спасибо! заранее!!

+2

«АСТ парсер» часть того, что набор инструментов? Моя догадка (я не знаю ваш набор инструментов) заключается в том, что ваши «посетители» собираются вместе, чтобы ходить по дереву, и что «visit (IfStmt ..)», возвращающий «false», приводит к тому, что дерево останавливается, когда if утверждение. Это предотвратило бы рекурсию вниз в подчасти «if», где скрывается ваше вложенное предложение «try». Попробуйте сделать "vist (IfStmt ...)" return "true" (возможно, вам нужно будет посещать своих детей?). –

+0

Спасибо! Работал :-) – Sangeeta

ответ

1

Мое предположение (я не знаю ваш набор инструментов) состоит в том, что ваши «посетители» собираются вместе, чтобы ходить по дереву, а «возвращение (IfStmt ..)», возвращающее «ложное», приводит к тому, что дерево прервать, когда узел дерева инструкций if.

Это предотвратит рекурсию вниз в подчасти «if», где скрывается ваше вложенное предложение «try».

Попробуйте сделать "vist (IfStmt ...)" return "true" (может потребоваться вызвать посещение его детей?).

+0

Привет Ира, я хотел спросить одну вещь. Если я хочу извлечь все блоки catch, мне нужно сделать посетителя для всех типов блоков «if», «switch» и т. Д. – Sangeeta

+1

Не мой пакет, это было образованное предположение, основанное на том, как много таких вещей работает. Поэтому я могу сказать, вероятно, да. Я думаю, вы должны внимательно прочитать документы на посетителях. –

Смежные вопросы