我在这里的枚举部分的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语句)。
我可以在枚举定义之外使用这种“默认情况是抛出异常”的语法糖吗?它有什么特别的名字吗?这被认为是短期削减“不在列表中的任何内容引发异常”的行为的好/坏做法吗?
答案 0 :(得分:3)
关于抛出AssertionError的教程的作者感到羞耻 - 为什么不利用Java提供给我们的例外,例如UnsupportedOperationException
答案 1 :(得分:2)
我不确定我是否收到您,但您似乎相信throw
是已发布代码示例中switch
语法的一部分。事实并非如此。 switch
块和throw
语句是两个单独的东西,恰好在此代码中彼此相邻。
更详细:case
中的四个switch
部分都包含return
语句,导致方法中的任何后续指令被跳过。如果case
部分都不匹配,则会在switch
块后面的行继续执行,该行恰好是throw
。
您可以在throw
之后以非常类似的方式使用if
:
if (something) {
return aValue;
}
throw new Exception("Nope");
答案 2 :(得分:0)
有default
个关键字:
switch (whatever) {
// ...
default: explode();
}
如果您希望默认情况下抛出异常,那么
default: throw new Explode();
您的示例仅按其方式工作,因为所有其他分支都从包含函数返回。 在我看来,这不是一个很好的编码习惯。
答案 3 :(得分:0)
在eclipse中,如果你没有在switch语句中覆盖所有枚举值,它会在编译时生成警告。
但是,如果您提出警告不再有效的default:
案例。所以,在某些IDE中,当switch语句中包含所有枚举值时,省略default
的情况有明显的优势。
通常,如果您的switch语句超过5-6个案例,请考虑重新设计代码。通常,人们不理解Java中的枚举是完整的类,枚举值是第一类对象,因此在许多情况下,不是通过switch语句驱动行为,而是可以让enum对象自己完成工作。
在这个特定的例子中,枚举可以有一个方法doOp( int x, int y)
,每个枚举成员可以实现此方法的特定风格。
答案 4 :(得分:0)
正如其他人所说,这不是语法糖。它的工作原理是因为交换机上的所有分支都从该方法返回。如果将一些其他枚举值放入交换机,则switch语句将在不运行任何分支的情况下完成,之后将执行throw语句。
switch(this) {
case PLUS: return x + y;
case MINUS: return x - y;
case TIMES: return x * y;
case DIVIDE: return x / y;
default: throw new AssertionError("Unknown op: " + this);
}
该代码在功能上是等效的。两者之间的主要区别在于,如果将值添加到Enum而不是switch语句,则没有default子句的switch将创建编译器警告。