首页 > 解决方案 > Java开关控制中的局部变量

问题描述

我发现这个案例有点奇怪:

    int x = 1;
    switch(x){
          case 0 :
             boolean b = false;
             break;
          case 1 :
             b = true; //will compile just right
             System.out.println(b); //will print true
             break;
          default:
                 System.out.println(b); //will not compile
       }

我只是觉得这很令人困惑。局部变量据说可以在整个代码块中访问。当然,b在 switch 块中,所以我可以理解它在不同的情况下可以访问,即使这似乎与 switch 流程相矛盾,它可能不会通过第一种情况,因此可能不会声明和初始化b

b但是,如果默认分支中仍然无法访问同时,这是否又矛盾了?

案例分支中的局部变量声明是否有任何特殊执行,无论案例是否匹配,它都会运行?如果是,那么为什么默认分支不能访问它?

编辑重复标志:这里的问题不是关于在 case 分支中声明的变量如何不是本地的(正如我上面提到的),而是为什么在 case 中声明的局部变量可以在它之外访问,而不是值它已被初始化。

发现了一个类似的问题,我相信它可以回答我的问题:Declaring and initializing variables within Java switch

标签: javaswitch-statement

解决方案


关键是默认情况意味着:没有采取其他情况。

switch 构造允许您在其整体范围内拥有局部变量,但仍然每个“读取”都必须看到之前的“写入”。

并且编译器可以很容易地检测到默认情况下没有看到b的初始化。

除此之外,您可以在不同情况下进行此类分配的原因是:整个 switch 语句只有一个“switch 块”。

有关详细信息,请参阅Java 语言规范


推荐阅读