在这里关于枚举的部分中,我注意到Java语言规范中的以下内容:link
switch(this) {
case PLUS: return x + y;
case MINUS: return x - y;
case TIMES: return x * y;
case DIVIDE: return x / y;
}
throw new AssertionError("Unknown op: " + this);但是,查看switch语句定义部分,我在任何地方都没有注意到这种特定的语法(相关的throw语句)。
我可以在枚举定义之外使用这种“默认情况是抛出异常”的语法糖吗?它有什么特别的名字吗?这是否被认为是一种好的/坏的做法来缩短这种“任何不在列表中的东西都会抛出异常”的行为?
发布于 2010-05-21 03:11:18
我不确定我是否理解了您的意思,但是您似乎相信在前面的代码示例中,throw是switch语法的一部分。事实并非如此。switch块和throw语句是两个独立的东西,在这段代码中,它们恰好放在一起。
更详细地说:switch中的四个case部件都包含return语句,导致该方法中的任何后续指令都被跳过。如果没有匹配的case部件,则在switch块之后的行上继续执行,该块恰好是一个throw。
您可以以非常类似的方式在if之后使用throw:
if (something) {
return aValue;
}
throw new Exception("Nope");发布于 2010-05-21 03:52:05
本教程的作者为抛出AssertionError而感到羞愧--为什么不利用Java语言已经提供的异常,比如UnsupportedOperationException
发布于 2010-05-21 03:11:35
有一个default关键字:
switch (whatever) {
// ...
default: explode();
}如果希望缺省情况抛出异常,则
default: throw new Explode();您的示例只能按照它的方式工作,因为所有其他分支都是从包含的函数返回的。在我看来,这不是一个很好的编码习惯。
https://stackoverflow.com/questions/2876988
复制相似问题