我一直在为一种语言编写解析,我在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这样的工具编写了许多解析,但我已经看了几个小时的代码,这对我来说似乎是正确的...
任何帮助理解为什么返回语句无法访问将非常感激!
答案 0 :(得分:2)
case
您的break
缺少tok2 == null
个,这意味着每个案例都会失败。这意味着将发生以下两件事之一:
switch
,抛出异常case
块。无论default
是否被命中,流程都会落到do
案例中,并且会抛出异常在任何一种情况下,第一次运行break
块都会保证抛出异常,因此跟随它的任何内容都无法访问。
解决方案:添加case Token.PACKAGE:
buf.append(tok2.token);
break; // <--- here
default:
// etc
语句,如下所示:
{{1}}
答案 1 :(得分:0)
到达分号令牌后,将触发默认情况并抛出异常。这是循环的唯一退出。
答案 2 :(得分:0)
你在任何地方都没有break语句,这意味着默认语句将被执行 - 导致异常被抛出,无论如何。返回语句永远不会被命中。