8

也可以使用 throw 来退出 switch 语句而不使用 break 关键字吗?为什么使用 throw 而不是 break?

switch(number)
{
    case 1:
        throw new RuntimeException("Exception number 1");
    case 2:     
        throw new RuntimeException("Exception number 2"); 
}
4

7 回答 7

12

在两种情况下,您可以使用 athrow来中断交换机的流程:

  1. 流量控制;一般来说,这是一个不好的做法——你不希望异常行为决定你的程序下一步决定去哪里。

  2. 不太可能但似是而非的默认情况以防您遇到不可能达到默认值的情况,但无论如何都会发生。不知何故。奇迹般地。或者,如果您有严格的编码标准,则要求 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");
         }
    }
    
于 2013-05-16T05:47:21.633 回答
4

我看到了一些在 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 ,您也可以在这里接受。breakthrow

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[...];
}
于 2013-05-16T05:55:47.857 回答
1

您可以throwswitch块中使用,但它不是很好的编码/设计实践。throw旨在控制代码中的异常/错误情况,而不是用于控制指令的执行。

虽然你可以throw在中使用switch,但我建议不要在中使用它switch。:)

于 2013-05-16T05:36:33.680 回答
0

您只谈论一种情况,您需要抛出异常。switch 旨在运行一个案例并打破它。如果它在一个方法中并且你只使用 throw 那么你将如何从该方法返回一个值?简单来说,throw 将返回方法,但 break 不会。您可以在使用 break 但不能使用 throw 切换后继续运行您的代码。

于 2013-05-16T05:43:13.433 回答
0

使用 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();
    }

这是更多的开销,而且您可以传递的数据只是字符串对象。

结论:-最好使用正常休息。

于 2013-05-16T05:53:35.553 回答
0

break 用于防止跌落到下一个案例,当你抛出异常时不会跌倒

    case 1:
        throw new UnsupportedOperationException();
        break;   <-- compile error, unreachable code

在 else 子句中抛出异常通常是有意义的

    switch (op) {
    case 1:
        // do something 
        break;
    ...
    default:
        throw new UnsupportedOperationException();
    }
于 2013-05-16T05:48:04.050 回答
-1

在 switch 语句中不能使用 throw 代替 break。因为 throw 仅用于异常,而 switch 用于条件目的...

于 2013-05-16T07:58:03.430 回答