基本上,switch语句的作用域很奇怪。从JLS的6.3节开始:
块中的局部变量声明的范围(第14.4节)是该声明在其中出现的其余部分,从其自身的初始化程序开始,并在局部变量声明语句的右侧包括其他任何声明符。
在您的情况下,即使永远不会执行,它也与它
case 2位于同 一块中 ,
case 1并在其后出现
case1……因此,即使您从逻辑上也从未“执行”该声明,该局部变量仍在范围内并且可用于 编写 。(尽管声明是初始化的,但它并不是真正的“可执行文件”。)
如果您注释掉该
value =2;赋值,编译器仍会知道您所指的是哪个变量,但是您将不会经历任何为其赋值的执行路径,这就是为什么您尝试执行此操作时会收到错误的原因读取其他任何未明确分配的局部变量。
我强烈建议您 不要 使用在其他情况下声明的局部变量-如您所见,这会导致代码非常混乱。当我在switch语句中引入局部变量时(我很少尝试这样做-
理想情况下,情况应该很短),我通常更喜欢引入新的作用域:
case 1: { int value = 1; ... break;}case 2: { int value = 2; ... break;}我相信这很清楚。



