Java - Switch语句和花括号

8
我有一个与 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;  
}

我知道这两种代码应该以相同的方式工作,但我认为这里存在一些不合理之处。由于break应该导致跳出花括号块,所以理论上第二个代码应该像这样平滑运行: 1. break课程跳出块 2. switch继续执行case val2或默认原因,在括号外没有任何断点声明。
你推荐使用哪个版本?它们真的以相同的方式工作吗?

3
你可以在几乎任何地方放置一个代码块,包括在一个语句块内部,但这不会影响控制流。 - amit
1
一个简单的复合语句(没有 switch 或循环)内部的 break 是不允许的。因此,它不能“跳出块”。 - laune
作用域定义了包含变量的生命周期和可见性,仅此而已。 - Binkan Salaryman
你也可以在每个case块中省略花括号 - 它们可能有助于限定变量的作用域,但并非必需的 - Jesper
我知道,但是我有相同名称的变量,使用不同的名称会误导,因为这是在Android内容提供程序中从URI读取ID。 - Michał Ziobro
2个回答

6

试试这个:

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

你将会看到

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

这意味着:你不能在块中使用它,它与块组合没有效果。 我不会将换行符放在块外面,但我从来没有见过编码规则要求任何一种方式(你可以为双方提出论据)。也许这是因为块很少用于分隔每个开关分支的可见性。

我理解,因此在这种情况下更好的方法是将break放置在花括号内部,如果它们与switch相关联而不是块本身。例如:switch { case A: { block; break; } case B: { block; break; } default: { block; break; } } - Michał Ziobro
使用您认为更易读的方式。- 三个月后再检查 ;-) - laune

2

花括号限制变量的作用域。除了if、for、while、switch..块以外,它们对流程控制没有影响,除非是可选的情况。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接