【问题标题】:Java - Switch statement and curly bracesJava - Switch 语句和花括号
【发布时间】:2015-03-26 09:43:38
【问题描述】:

我有一个与 switch-case 块中的花括号相关的问题

 switch( conditon ) { 

   case val1: {
      // something 
   }
   break;
   case val2: {
      // something 
   }
   break; 
   default:
   break;  
}

或类似的东西:

 switch( conditon ) { 

   case val1: {
      // something 
      break;
   }
   case val2: {
      // something 
      break;
   } 
   default:
   break;  
}

A 我知道这两个代码应该以相同的方式工作,但我认为这里存在一些不合理之处。由于中断应该导致从花括号块中跳出,所以理论上第二个代码应该像这样平滑: 1. 突破路线跳出块 2. switch 继续执行 case val2 或 default 原因,大括号外没有任何 break 语句。

您推荐使用哪个版本,它们的工作方式是否真的相同?

【问题讨论】:

  • 你几乎可以在任何地方放一个block,在case里面也不例外,但是对控制流没有影响
  • 不允许在单纯的复合语句(并且没有开关或循环)中出现中断。因此,它不会“跳出块”。
  • 范围定义了所包含变量的生命周期和可见性,仅此而已。
  • 您也可以为每个 case 块保留花括号 - 它们可能对分隔变量的范围很有用,但它们不是必需的
  • 我知道,但我有同名的变量,使用不同的名称会产生误导,因为这是从 android 内容提供程序中的 URI 读取 ids

标签: java switch-statement break curly-brackets


【解决方案1】:

试试这个:

{
System.out.println("A");
break;
System.out.println("B");
}

你会看到

$ javac Y.java 
Y.java:35: error: break outside switch or loop
    break;
    ^
1 error

这意味着:你不能在一个块中使用它,它与一个块结合起来没有效果。

我不会将中断放在块之外,但我从未见过编码规则要求任何一种方式(你可以为双方提出论据)。这可能是因为块不经常用于分隔每个 switch 分支的可见性。

【讨论】:

  • 我明白,在这种情况下,我认为如果它们与开关相关联,而不是与块本身相关,那么在这种情况下,将 break 放置在卷曲的地方会是相当好的方法。像 switch { case A: block case B block default block }
  • 使用的感觉提供更好的可读性。 - 三个月后检查 ;-)
【解决方案2】:

花括号限制变量的范围。并且除了 if、for、while、switch.. 块之外对流控制没有影响,除非它们是可选的

【讨论】:

    猜你喜欢
    • 2018-05-05
    • 2011-11-14
    • 2012-11-22
    • 1970-01-01
    • 2019-07-11
    • 2017-06-14
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    相关资源
    最近更新 更多