为什么在案例块中定义的变量在其他案例块中可用?

时间:2012-01-04 12:03:02

标签: java switch-statement

  

可能重复:
  Why are variables not local in case statements?

范围块中定义的变量不能在其外部使用。例如,以下代码段无效:

{
    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的声明位置。)

5 个答案:

答案 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;
}

或者将它们从开关块中声明出来(更糟)。或者把它放在你定义常量的地方。

如果它们确实是不同的变量(可能只是在某种程度上相似): 在每种情况下定义一个不同的变量。

顺便说一句:这是一个非常好的问题!