switch case语句中的java范围声明如何?

时间:2015-02-26 16:21:57

标签: java switch-statement

以下Java代码在Java 1.7中无错误地执行

public static void main(String[] args) {
    int x = 5;

    switch(x) {
        case 4: 
            int y = 3423432;
            break;  
        case 5: {
            y = 33;
        }
    }
}

java如何确定y是一个int,因为声明永远不会运行。在case语句中没有使用大括号时,case语句中的变量声明是否限定为switch语句级别?

3 个答案:

答案 0 :(得分:9)

声明不是“运行” - 它们不是需要执行的东西,它们只是告诉编译器变量的类型。 (初始化程序会运行,但是没关系 - 在为其赋值之前,你不会尝试读取变量。)

在switch语句中确定范围绝对是奇怪的,但基本上第一个case中声明的变量仍然在第二个case范围内。

来自section 6.3 of the JLS

  

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

除非您创建额外的块,否则整个switch语句是一个块。如果您想为每个案例设置一个新范围,可以使用大括号:

case 1: {
    int y = 7;
    ...
}
case 2: {
    int y = 5;
    ...
}

答案 1 :(得分:1)

案例本身并未声明范围。范围受{}限制。因此,您的变量y在外部范围(整个开关)中定义,并在内部范围(case 5)中更新。

答案 2 :(得分:0)

据我所知,完整的switch语句是一个范围。 没有休息;或返回;声明其他开关案例也将被解释。因此,当您在switch语句中定义变量时,它在孔开关盒中可见。