Java 在switch语句中可以使用throw代替break吗?

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,但这不是很好的编码/设计实

throw也可以用于在不使用break关键字的情况下退出switch语句吗?为什么要用投掷而不是休息

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[...];
    }