可以抛出也可以用来退出switch语句而不使用break关键字吗?为什么要使用投掷而不是休息?
switch(number)
{
case 1:
throw new RuntimeException("Exception number 1");
case 2:
throw new RuntimeException("Exception number 2");
}
答案 0 :(得分:11)
有两种情况可以使用throw
来中断交换机的流量:
流程控制;一般来说,这是一个糟糕的练习 - 您不希望出现特殊行为,决定您的计划决定下一步的位置。
不太可能但默认情况;万一你达到了默认 不可能的条件,但无论如何都会发生。不知何故。不可思议的。或者,如果您有严格的编码标准,则要求switch语句具有默认情况。
示例:
public class Test {
public static enum Example {
FIRST_CASE,
SECOND_CASE;
}
public void printSwitch(Example theExampleCase) {
switch(theExampleCase) {
case FIRST_CASE:
System.out.println("First");
break;
case SECOND_CASE:
System.out.println("Second");
break;
default: // should be unreachable!
throw new IllegalStateException(
"Server responded with 724 - This line should be unreachable");
}
}
答案 1 :(得分:2)
我看到了抛出switch语句的一些原因。
第一:不是休息而是作为default
案件的主体。请考虑以下示例,其中在枚举上定义了开关:
pubic enum E {
A,
B
}
首次编写时的切换如下所示:
E e = ...;
switch (e) {
case A:
...
break;
case B:
...
break;
default:
throw new IllegalStateException("Unknown enumeration value " + e);
}
throw是对枚举E
的未来扩展的后备。
第二:有时我有小的getter函数,例如在Swing表模型中。在那里我使用return而不是break;
public String getColumnName(int col)
{
switch (col)
{
case 0: return "Column 0";
case 1: return "Column 1";
...
这是为了简洁或紧凑。可以说这些回报打破了控制流程。这是真的。但是,我认为出于紧凑的原因,可能会允许这里。
如果您在这种情况下接受return
而不是break
,那么您也可以接受throw
。
Object[] x = ...; // get some array which is not null from a function which
// only returns arrays, e.g. OSGI services
switch (x.length)
{
case 0: throw new IllegalArgumentException("No service defined");
case 1: return x[0]; // return the only available service
default:
... // evaluate all services and return the best matching one
return x[...];
}
答案 2 :(得分:1)
您可以在throw
块中使用switch
但不是很好的编码/设计实践。 throw
用于控制代码中的异常/错误情况,而不是用于控制指令的执行。
尽管您可以在throw
中使用switch
,但我建议您不要在switch
中使用它。 :)
答案 3 :(得分:0)
您所说的只是一个场景,您需要抛出异常。 switch旨在运行一个案例并打破它。如果它在一个方法中,如果你只使用throw,那么你将如何从该方法返回一个值? 简单来说,throw将返回方法,但break不会。您可以在切换后继续运行代码,但不能使用throw。
答案 4 :(得分:0)
break用于防止通过下一个案例掉落,当你抛出异常时就不会掉下来
case 1:
throw new UnsupportedOperationException();
break; <-- compile error, unreachable code
在其他条款
中抛出异常通常是有意义的 switch (op) {
case 1:
// do something
break;
...
default:
throw new UnsupportedOperationException();
}
答案 5 :(得分:0)
使用throw代替中断几乎没有问题;
1)当你抛出一些异常时,其余部分的执行就会停止。
即:
int m=0;
switch (m) {
case 0:
y=10;
break;
case 2:
y=11;
break;
default:
break;
}
System.out.println(y);//this y will never be printed if Exceptions are thrown
2)异常通常表示某些错误情况,并且不是每次都应该创建异常。
3)从
获取“异常编号1”的值throw new RuntimeException("Exception number 1");
你必须紧急抓住阻塞并调用e.getMessage();
像:
catch(RuntimeException e){
String str=e.getMessage();
}
这是更多的开销,您可以传递的数据也只是字符串对象。
结论: - 最好使用普通休息。
答案 6 :(得分:-1)
throw不能在switch语句中使用而不是break。因为throw仅用于异常,而switch用于条件目的......