为什么此Java代码的最后一行无法访问

时间:2014-03-15 06:58:57

标签: java

我一直在为一种语言编写解析,我在Java中遇到了意想不到的问题。具体来说,Java编译器表示此代码末尾的return语句无法访问。

        StringBuffer buf = new StringBuffer();
        Token tok2;
        do {
            tok2 = tokenizer.nextToken();
            if (tok2 == null) throw new ParseException("Unexected end of file", tok2.endLine, tok2.endColumn);

            switch (tok2.type) {
            case Token.IDENTIFIER:
            case Token.PACKAGE:
                buf.append(tok2.token);
            default:
                throw new ParseException("Illegal character: expected identifier or .", tok.beginColumn, tok.beginLine);
            }

        } while (tok2.type != Token.SEMI_COLON);
        return new PackageElement(buf.toString(), tok.beginLine, tok.beginColumn, tok2.endLine, tok2.endColumn);

tok2.type是一个int,常量是整数,ParseException是一个经过检查的异常...

我明白了什么"无法到达"意味着我已经从头开始和通过像JavaCC这样的工具编写了许多解析,但我已经看了几个小时的代码,这对我来说似乎是正确的...

任何帮助理解为什么返回语句无法访问将非常感激!

3 个答案:

答案 0 :(得分:2)

case您的break缺少tok2 == null个,这意味着每个案例都会失败。这意味着将发生以下两件事之一:

  • if switch,抛出异常
  • 否则,触发case块。无论default是否被命中,流程都会落到do案例中,并且会抛出异常

在任何一种情况下,第一次运行break块都会保证抛出异常,因此跟随它的任何内容都无法访问。

解决方案:添加case Token.PACKAGE: buf.append(tok2.token); break; // <--- here default: // etc 语句,如下所示:

{{1}}

答案 1 :(得分:0)

到达分号令牌后,将触发默认情况并抛出异常。这是循环的唯一退出。

答案 2 :(得分:0)

你在任何地方都没有break语句,这意味着默认语句将被执行 - 导致异常被抛出,无论如何。返回语句永远不会被命中。