【问题标题】:When are references declared in a switch statement?什么时候在 switch 语句中声明引用?
【发布时间】:2010-06-17 07:56:35
【问题描述】:

令我惊讶的是,这段代码运行良好:

int i = 2;
switch(i) {
case 1:
    String myString = "foo";
    break;
case 2:
    myString = "poo";
    System.out.println(myString);
}

但是 String 引用永远不应该被声明?是不是每一种情况下的所有变量总是无论如何都被声明了,或者这是如何解决的?

【问题讨论】:

  • 不是所有的声明都在包含它们的 {...} 块的开头完成吗?
  • 我认为朱尔斯是对的​​。 Java 具有静态作用域,因此控制流不会影响变量的创建(与初始化相反)。堆栈上的位置是在进入开关块时分配的。但它仍然是一种古玩。 GCC 拒绝编译等效的 C 代码,原因与(我认为)Java 拒绝编译 if(someBool) String s = "foo"; 的原因相同

标签: java switch-statement


【解决方案1】:

嗯,这是关于括号(即范围)。

可以说,这样写你的陈述是更好的做法:

int i = 2;
switch(i) {
    case 1: {
        String myString = "foo";
        break;
    }
    case 2: {
        myString = "poo";
        System.out.println(myString);
    }
}

(我现在不在 Java 编译器附近,但它不应该编译)。

【讨论】:

  • @musikk:感谢您的确认,我通常不会因为某些东西无法编译而感到高兴 :)
  • 挺有意思的……你不用多想,但是可以通过大括号进一步任意限制某些变量的范围……
【解决方案2】:

myString 声明的范围是 switch 块({ 字符所在的位置)。如果你要这样写,声明将是每个案例:

int i = 2;
switch(i) {
    case 1: {
        String myString = "foo";
        break;
    }

    case 2: {
        String myString = "poo";
        System.out.println(myString);
    }
}

【讨论】:

    猜你喜欢
    • 2021-11-24
    • 2022-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    • 1970-01-01
    相关资源
    最近更新 更多