Java: Как предотвратить непредвиденное исключение токена из-за прерывания времени выполнения? - PullRequest
0 голосов
/ 26 декабря 2011

Я хочу отсканировать входной файл (.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 Ответ

1 голос
/ 26 декабря 2011

Вы можете поместить try-catch внутри цикла while.В настоящее время исключение обрабатывается вне цикла while, поэтому цикл завершается, как только возникает исключение.

Также вам не нужно перебирать StackTraceElement, вместо этого вы можете выполнить e.printStackTrace().

...