在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 = 2case 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 2case 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该开关的分支,则根本不会发生。

http://www.coderanch.com/t/447381/java-programmer-SCJP/certification/variable-initialization-within-case-block

声明在编译时处理,不依赖于代码的执行stream程。 由于value是在开关块的本地范围内声明的,因此它可以在声明的时候在该块的任何地方使用。