Java 在switch语句中可以使用throw代替break吗?
throw也可以用于在不使用break关键字的情况下退出switch语句吗?为什么要用投掷而不是休息Java 在switch语句中可以使用throw代替break吗?,java,oop,exception,throw,Java,Oop,Exception,Throw,throw也可以用于在不使用break关键字的情况下退出switch语句吗?为什么要用投掷而不是休息 switch(number) { case 1: throw new RuntimeException("Exception number 1"); case 2: throw new RuntimeException("Exception number 2"); } 您可以在switch块中使用throw,但这不是很好的编码/设计实
switch(number)
{
case 1:
throw new RuntimeException("Exception number 1");
case 2:
throw new RuntimeException("Exception number 2");
}
您可以在
switch
块中使用throw
,但这不是很好的编码/设计实践<代码>抛出旨在控制代码中的异常/错误情况,而不是控制指令的执行
即使您可以在
开关中使用throw
,我建议不要在开关中使用它:) 您只讨论了一个场景,您需要抛出异常。开关设计用于运行箱子并将其断开。如果它在一个方法中,并且您只使用throw,那么您将如何从该方法返回一个值?
简单地说,throw将返回方法,而break将不返回。您可以在使用break切换后继续运行代码,但不能使用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");
}
}
break用于防止掉入下一个案例,当您抛出异常时,将不会掉入
case 1:
throw new UnsupportedOperationException();
break; <-- compile error, unreachable code
用投掷代替休息几乎没有问题
public String getColumnName(int col)
{
switch (col)
{
case 0: return "Column 0";
case 1: return "Column 1";
...
1) 当您抛出一些异常时,函数其余部分的执行将停止
即:
2) 异常通常表示一些错误情况,而不是每次开关都应该创建异常
3) 从中获取值“异常编号1”
您必须捕获块并调用e.getMessage()
比如:
这会带来更大的开销,而且您可以传递的数据只是字符串对象
结论:-
最好使用正常中断。我看到了在switch语句中加入throw的一些原因
第一:不是作为中断,而是作为默认值的主体。考虑下面的示例,其中枚举上定义了开关:
pubic enum E {
A,
B
}
第一次写入时的开关如下所示:
E e = ...;
switch (e) {
case A:
...
break;
case B:
...
break;
default:
throw new IllegalStateException("Unknown enumeration value " + e);
}
抛出是对枚举E
的未来扩展的回退
第二:有时我会使用where小getter函数,例如在Swing表模型中。在那里,我使用返回而不是中断
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[...];
}
在switch语句中不能使用throw代替break。因为throw仅用于异常,而switch用于条件目的…您不应该这样做。不应使用异常来控制流。对异常使用异常。如果开关内部发生异常,则可以。因为您是按您键入的字符数获得报酬的,所以您可能在开关语句中抛出的一个合理的标准位置是默认情况。如果到达那个案例表明输入无效,那么抛出异常是合理的。关于异常,switch语句没有什么特殊之处。引发异常的原因与其他代码中的原因相同。除了在开关中使用return
或break
之外,您还可以使用throw
,因为这三个异常都是突然完成的(即,将控制权返回到当前运行方法之外的其他地方)。我倾向于同意这一点。如果您在交换机“case”部分中涵盖了所有可能的情况,那么为什么不在“default”部分中抛出一个异常,首先表明传入的参数是错误的,其次是为了防止交换机结构将来扩展。
E e = ...;
switch (e) {
case A:
...
break;
case B:
...
break;
default:
throw new IllegalStateException("Unknown enumeration value " + e);
}
public String getColumnName(int col)
{
switch (col)
{
case 0: return "Column 0";
case 1: return "Column 1";
...
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[...];
}