switch语句中的重复局部变量

Som*_*one 6 java eclipse switch-statement

我使用Eclipse收到此错误.

重复的局部变量斗篷

我真的不明白为什么我会遇到这样的错误.这是我的代码:

switch (frame) {  // frame is an integer
case 0:
    Sprite cape = modules.get(Module.CAPE);
    //cape.setRegion(region);
    cape.translateY(+1);
    break;
case 1:
    Sprite cape = modules.get(Module.CAPE);
    //cape.setRegion(region);
    cape.translateY(-1);
    break;
default:
    throw new IllegalArgumentException(
            "Undefined frame number: " + frame);
}
Run Code Online (Sandbox Code Playgroud)

为什么cape变量对于每种情况都是本地的,而不是switch语句?

fge*_*fge 12

整个switch语句与任何其他语句一样是一个代码块.但是你可以在代码块中创建代码块,所以:

case 0: {
    // code here
}
case 1: {
    // other code here
}
Run Code Online (Sandbox Code Playgroud)

(如果switch在这方面特别对待你,你无法做到贯彻)


rge*_*man 9

每个案例都在同一个块中,具体来说{}就是switch声明.即使不同的情况定义相同的变量,这也是同一个块.

通过添加{}s 为每个案例定义自己的块:

case 0:
  {
    Sprite cape = modules.get(Module.CAPE);
    //cape.setRegion(region);
    cape.translateY(+1);
  }
    break;
case 1:
  {
    Sprite cape = modules.get(Module.CAPE);
    //cape.setRegion(region);
    cape.translateY(-1);
  }
    break;
Run Code Online (Sandbox Code Playgroud)

或者您可以cape在之前声明,switch因此它在范围内,您使用引用.

Sprite cape;
switch (frame) {  // frame is an integer
case 0:
    cape = modules.get(Module.CAPE);
Run Code Online (Sandbox Code Playgroud)

并且类似于案例1.


Sot*_*lis 8

为什么cape变量对于每种情况都是本地的,而不是switch语句?

因为JLS这么说

(第14.4节)中局部变量声明的范围是声明出现的的其余部分,从其自己的初始化器开始,并包括局部变量声明语句中右侧的任何其他声明符.

而且 switch

switch语句的主体称为switch块.

A case没有定义范围.它switch是定义新范围的块.