可以在switch语句中使用throw而不是break吗?

时间:2013-05-16 05:28:17

标签: java oop exception throw

可以抛出也可以用来退出switch语句而不使用break关键字吗?为什么要使用投掷而不是休息?

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

7 个答案:

答案 0 :(得分:11)

有两种情况可以使用throw来中断交换机的流量:

  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");
         }
    }
    

答案 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用于条件目的......