Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Switch语句:为什么可以';我在不同的情况下有相同的变量名吗?JAVA_Java_Duplicates_Switch Statement - Fatal编程技术网

Switch语句:为什么可以';我在不同的情况下有相同的变量名吗?JAVA

Switch语句:为什么可以';我在不同的情况下有相同的变量名吗?JAVA,java,duplicates,switch-statement,Java,Duplicates,Switch Statement,我仍在编写代码,在我这样的项目中没有太大的区别,但如果我要做更大的事情,那将是一件痛苦的事。这是: case 0: System.out.print("Insert the N: "); double N = in.nextDouble(); double mol = N / Na; System.out.print("There are " + mol + " mol in that

我仍在编写代码,在我这样的项目中没有太大的区别,但如果我要做更大的事情,那将是一件痛苦的事。这是:

        case 0:
            System.out.print("Insert the N: ");
            double N = in.nextDouble();
            double mol = N / Na;
            System.out.print("There are " + mol + " mol in that sample");
            break;

        case 1:
            System.out.print("Insert the m: ");
            double m = in.nextDouble();
            System.out.print("Insert the M: ");
            double M = in.nextDouble();
            double mol = m / M;
            System.out.print("There are " + mol + " mol in that sample");
            break;

        case 2:
            System.out.print("Insert the V: ");
            double V = in.nextDouble();
            double mol = V / Vm;
            System.out.print("There are " + mol + " mol in that sample");
            break;
第一个“mol”没有问题,但在案例1和案例2中,它表示“复制局部变量mol”。如果我使用If语句,它就会工作。Java就是这样,还是有办法解决


谢谢

,因为这些变量在
单个块中
可能是您本应该用一些
方法
编写这个
开关
语句的。
在单个方法中,不能使用dup变量。

这是因为
案例不创建范围。因此,这两种情况下的变量都在同一范围内。如果要这样做,可以为每个案例添加大括号,这将为每个案例创建一个新范围

    case 0: {
        System.out.print("Insert the N: ");
        double N = in.nextDouble();
        double mol = N / Na;
        System.out.print("There are " + mol + " mol in that sample");
        break; 
    }

    case 1: {
        System.out.print("Insert the m: ");
        double m = in.nextDouble();
        System.out.print("Insert the M: ");
        double M = in.nextDouble();
        double mol = m / M;
        System.out.print("There are " + mol + " mol in that sample");
        break;
    }
但是,理想情况下,不需要为每种情况声明单独的局部变量。如果您在所有情况下都使用一个变量,那么这清楚地表明该变量将直接在
开关
语句中声明:

switch (someVar) {
    double mol = 0.0;

    case 0: mol = n / Na;
            break;

    case 1: mol = m / M;
            break;
}

附言:我可以建议你把变量命名为英语字母以外的东西吗?
n
M
n

我想我只是在每种情况下使用{和}来解决它。如果语句是不同的块。在您的示例中,只有一个块。您通常应该在
switch
子句的范围之外声明局部变量。如果您发现自己确实想要这样做,它可能会建议您需要将方法分解为从案例中调用的各个方法。否则,请在方法的顶部声明变量。如果您想知道,这是因为在Java(如C/C++)中,开关大括号内的所有内容都是同一堆栈框架的一部分,大小写标签只是-label(如您在C/C++中使用的goto语句)。因此,所有变量名都必须是唯一的。但是,将大括号添加到每个case语句中会创建一个新的堆栈框架,从而可以自由选择变量命名。如果有足够的代码,我觉得我必须让变量接近它们的使用位置,那么案例应该是从案例中调用的它们自己的方法。2.如果不是,则在包含
开关的方法顶部声明公共变量。3.(还有一个非常遥远的第三个)这个。@T.J.Crowder实际上,我自己都不记得上次在Java中使用这种变通方法是什么时候了。这真的应该避免:)@RohitJain:我想你只是在彻底检查而已。:-)可以确认,这个解决方案也可以在Javascript中工作:D