范围块中定义的变量不能在其外部使用。例如,以下代码段无效:
{
int anothervar = 4;
}
{
System.out.println(anothervar);
}
但看起来case
块不会创建单独的范围。
switch (mode) {
case ONE:
dosomething();
return;
case TWO:
int[] someints = new int[] { 2, 3, 5, 7 };
SomeObject obj = new SomeObject();
return;
case THREE:
someints = new int[] { 1, 4, 6, 8, 9 };
obj = new SomeObject();
return;
}
为什么我不必在someints
'区块'中声明case THREE
?
假设mode = THREE
,则永远不会达到变量someints
的声明,因为跳过了case TWO
,其中声明了someints
。或者不是吗? 内部如何运作?
(Why are variables not local in case statements?中选择的答案表明switch语句在内部是一组jump
命令,但仍然没有解释变量someints
的声明位置。)
答案 0 :(得分:4)
局部变量的范围在块内,如Names documentation:
中所指定块(第14.4.2节)中局部变量声明的范围是 声明出现的块的其余部分,从其开始 拥有初始化程序(第14.4节)并包括任何进一步的声明符 在本地变量声明声明中。
一个块被定义为具有括号,如Blocks and Statements documentation所示:
块是一系列语句,本地类声明和 大括号内的局部变量声明语句。
答案 1 :(得分:0)
{ }
内的所有内容都在同一范围内。例如,如果您在TWO情况下取出return;
,则可以在THREE情况下使用该变量,前提是它已初始化。
答案 2 :(得分:0)
这就是您有时会看到以下代码的原因:
case 0: {
// Stuff
}
只有{}分隔块。
答案 3 :(得分:0)
声明的范围由{ ... }
标记,您可能会在一秒内从一个案例中删除。我承认这是一个漏洞。我相信Java的旧版本不允许在case
级别声明,并且必须添加额外的大括号:
case 1: { int x; ... }
答案 4 :(得分:0)
除了其他回答者(他们注意到,{}之间的范围只有一个)我想注意,这种做法:在一个案例中声明变量并在另一个案例中使用它是脏即可。稍后您可以删除或更改某些案例。如果它是声明的那个,你将不得不改变另一个案例。这可能会导致错误。
彻底思考 - 为什么你的变量应该在两种情况下?它真的是同一个或两个不同的东西吗?
如果是相同的: 最好在默认情况下声明公共变量并将其作为第一个变量。
switch (mode) {
default:
int[] someints;
return;
case ONE:
dosomething();
return;
case TWO:
someints = new int[] { 2, 3, 5, 7 };
SomeObject obj = new SomeObject();
return;
case THREE:
someints = new int[] { 1, 4, 6, 8, 9 };
obj = new SomeObject();
return;
}
或者将它们从开关块中声明出来(更糟)。或者把它放在你定义常量的地方。
如果它们确实是不同的变量(可能只是在某种程度上相似): 在每种情况下定义一个不同的变量。
顺便说一句:这是一个非常好的问题!