在Java开关中声明和初始化variables
我有一个关于Java开关的疯狂的问题。
int key = 2; switch (key) { case 1: int value = 1; break; case 2: value = 2; System.out.println(value); break; default: break; }
scheme1 – 当key
为2时,成功将值打印为2。
情况2 – 当我要在case 2:
评论value = 2
时case 2:
它声明说本地variables值可能没有被初始化 。
问题:
情况1:如果执行stream程没有进入case 1:
(当key = 2
),那么它如何知道值variables的types为int
?
场景2:如果编译器知道值variables的types为int
,那么它必须访问到int value = 1;
case 1:
expressioncase 1:
。(声明和初始化)。 那么为什么sqawrk当我要在case 2:
注释value = 2
时,说本地variables的值可能没有被初始化 。
基本上,开关语句在范围界定方面是奇怪的。 从JLS第6.3节 :
块(14.4)中的局部variables声明的范围是声明出现的块的其余部分,从其自己的初始化程序开始,并在本地variables声明语句右侧包含任何其他声明程序。
在你的情况下, case 2
与case 1
在同一个块中 ,并且出现在case 1
之后,即使case 1
永远不会执行…所以局部variables在范围之内并且可以用于写入,尽pipe逻辑上从不“执行”该声明。 (虽然初始化是一个声明不是真的“可执行的”。)
如果你注释掉value = 2;
编译器仍然知道你指的是哪个variables,但是你不会经历任何给它赋值的执行path,这就是为什么当你试图读取任何其他的not-明确分配的局部variables。
我强烈build议您不要使用在其他情况下声明的局部variables – 这会导致代码非常混乱,正如您所见。 当我在switch语句中引入局部variables时(我试图很less做 – 理想情况下应该很短)我通常更喜欢引入一个新的范围:
case 1: { int value = 1; ... break; } case 2: { int value = 2; ... break; }
我相信这更清楚。
该variables已被声明(作为一个int),但没有初始化(分配一个初始值)。 想想这条线:
int value = 1;
如:
int value; value = 1;
int value
部分在编译时告诉编译器,你有一个variables,它是一个int值。 value = 1
部分对它进行初始化,但在运行时发生,如果没有input该开关的分支,则根本不会发生。
声明在编译时处理,不依赖于代码的执行stream程。 由于
value
是在开关块的本地范围内声明的,因此它可以在声明的时候在该块的任何地方使用。