Java:如何防止意外的令牌异常终止运行时?

时间:2011-12-25 20:29:38

标签: java file-io exception-handling antlr lex

我想根据词法分析器语法扫描输入文件(.txt),并识别其标记。但是只要看到第一个意外的令牌,程序就会终止并且只是第一个例外。

我该怎么做才能使程序继续运行并查找并打印所有其他意外令牌直到文件末尾。 例如,我的输入为int $de #de,但在达到$de后,程序会终止,并且不会显示有关#de的任何例外

这是我的代码:

public class Main {

    private static HashMap<String, String> keywords = new HashMap<String, String>();
    private static HashMap<Integer, String> tokenType = new HashMap<Integer, String>();

    public static void main(String[] args) {

        setHashMap();
        String type , tokInformation;
        int blkNo=0 , blkOrd =0;

        Token token=Token.badToken;
        FileReader r;
        BufferedReader br=null;
        MyLexer lex = null;

        try
        {
            r = new FileReader("inputFile.txt");
            br = new BufferedReader(r);
            lex =  new MyLexer(r);
        }
        catch(IOException u ){ 
            u.printStackTrace();
        }


        try{

            token = lex.nextToken();

            while (token.getType()!= Token.EOF_TYPE)
            {
                if(token.getType()==MyLexerTokenTypes.OPEN_ACCOLADE){
                    blkNo ++;
                    blkOrd++;
                }
                if(token.getType()==MyLexerTokenTypes.CLOSE_ACCOLADE)
                    blkNo--;

                if(token.getType()==MyLexerTokenTypes.IDENTIFIER)
                {
                    type=keywords.get(token.getText());
                    if(type==null)
                        type = "IDENTIFIER";
                }
                else
                    type = tokenType.get(token.getType());

                tokInformation = token.getText() + "\t\t"+ type + "\t\t\t"+
                            token.getLine() + "\t\t"+ token.getColumn()+"\t\t"
                            +blkNo+"\t\t"+blkOrd;
                System.out.println(tokInformation);
                token = lex.nextToken();
            }

        }//end try

        catch(Throwable t)
        {
            System.err.println("Exception: "+t.toString());
            for(StackTraceElement e : t.getStackTrace())
                System.err.println("\t"+ e);
        }   

    }

1 个答案:

答案 0 :(得分:1)

您可以将try-catch放在while循环中。目前异常是在while循环之外处理的,所以while一旦发生异常就会终止。

此外,您无需迭代StackTraceElement,而是可以执行e.printStackTrace()