也可以使用 throw 来退出 switch 语句而不使用 break 关键字吗?为什么使用 throw 而不是 break?
switch(number)
{
case 1:
throw new RuntimeException("Exception number 1");
case 2:
throw new RuntimeException("Exception number 2");
}
在两种情况下,您可以使用 athrow
来中断交换机的流程:
流量控制;一般来说,这是一个不好的做法——你不希望异常行为决定你的程序下一步决定去哪里。
不太可能但似是而非的默认情况;以防您遇到不可能达到默认值的情况,但无论如何都会发生。不知何故。奇迹般地。或者,如果您有严格的编码标准,则要求 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");
}
}
我看到了一些在 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
而不是 a ,您也可以在这里接受。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[...];
}
您可以throw
在switch
块中使用,但它不是很好的编码/设计实践。throw
旨在控制代码中的异常/错误情况,而不是用于控制指令的执行。
虽然你可以throw
在中使用switch
,但我建议不要在中使用它switch
。:)
您只谈论一种情况,您需要抛出异常。switch 旨在运行一个案例并打破它。如果它在一个方法中并且你只使用 throw 那么你将如何从该方法返回一个值?简单来说,throw 将返回方法,但 break 不会。您可以在使用 break 但不能使用 throw 切换后继续运行您的代码。
使用 throw 代替 break 的问题很少;
1)当您抛出一些异常时,其余函数的执行将停止。
IE:
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");
您必须编写 catch 块并调用 e.getMessage();
喜欢:
catch(RuntimeException e){
String str=e.getMessage();
}
这是更多的开销,而且您可以传递的数据只是字符串对象。
结论:-最好使用正常休息。
break 用于防止跌落到下一个案例,当你抛出异常时不会跌倒
case 1:
throw new UnsupportedOperationException();
break; <-- compile error, unreachable code
在 else 子句中抛出异常通常是有意义的
switch (op) {
case 1:
// do something
break;
...
default:
throw new UnsupportedOperationException();
}
在 switch 语句中不能使用 throw 代替 break。因为 throw 仅用于异常,而 switch 用于条件目的...