在Java中使用switch语句无法访问的代码

在Java中使用switch语句无法访问的代码,java,switch-statement,java.util.scanner,Java,Switch Statement,Java.util.scanner,因此,我正在构建一个电子邮件管理应用程序,尽管它使用if语句,但我正在尝试合并switch语句。我正在提示用户使用扫描仪选择他们来自哪个部门,同时生成与之关联的电子邮件。虽然当我试图返回这个部门时,它说它无法访问。我觉得我错过了一些非常明显的东西 // Ask for the department private String setDepartment() { Scanner sc = new Scanner(System.in); int department;

因此,我正在构建一个电子邮件管理应用程序,尽管它使用if语句,但我正在尝试合并switch语句。我正在提示用户使用扫描仪选择他们来自哪个部门,同时生成与之关联的电子邮件。虽然当我试图返回这个部门时,它说它无法访问。我觉得我错过了一些非常明显的东西

// Ask for the department
private String setDepartment() {
    Scanner sc = new Scanner(System.in);
    int department;
    
    System.out.println("Select your department:\n1. Sales\n2.Accounting\n3.Development\n4.N/A");
    department = sc.nextInt();
    
    while (true) {
        switch (department) {
            case 1:
                this.department = "Sales";
                break;
            case 2:
                this.department = "Accounting";
                break;
            case 3:
                this.department = "Development";
                break;
            case 4:
                this.department = "";
                break;
            default:
                System.out.println("Please choose a valid option (1-4)");
                break;
        }
        sc.close();
    }
    return this.department; <-- Error: Unreachable code
}
//询问部门
私人部门(){
扫描仪sc=新的扫描仪(System.in);
国际部;
System.out.println(“选择您的部门:\n1.销售\n2.会计\n3.开发\n4.不适用”);
department=sc.nextInt();
while(true){
交换机(部门){
案例1:
this.department=“销售”;
打破
案例2:
该部门为“会计”;
打破
案例3:
本部=“发展”;
打破
案例4:
本部=”;
打破
违约:
System.out.println(“请选择有效选项(1-4)”;
打破
}
sc.close();
}

返回this.department;问题在于您的
开关
-语句在
while中(true)
从未退出的循环。除非您明确退出循环,例如使用
break
,否则程序将永远不会停止执行循环,这意味着它下面的任何代码将永远无法到达,这就是编译器抱怨的问题。

问题在于while()中的条件循环。它总是设置为true,因此while循环下面的代码永远不会执行。尝试在while循环中设置一个不同的条件,该条件以某个值终止。否则,需要在while循环中放置想要返回的内容

额外:请将您的
sc.close();
放在while循环之外,否则您无法在第一次while循环迭代后使用资源。因此,关闭资源必须始终在最后完成。

解决方案1:

while(updatedTerminationCondition){//change the termination condition





}

解决方案2:

while(true){




//place your return value inside here but then loop will only run once  
}


可以重写此代码,以消除类成员的无限循环和冗余局部变量名称:

私有字符串setDepartment(){
扫描仪sc=新的扫描仪(System.in);
System.out.println(“选择您的部门:\n1.销售\n2.会计\n3.开发\n4.不适用”);
while(null==this.department){
开关(sc.nextInt()){
案例1:
this.department=“销售”;
打破
案例2:
该部门为“会计”;
打破
案例3:
本部=“发展”;
打破
案例4:
本部=”;
打破
违约:
System.out.println(“请选择有效选项(1-4)”;
打破
}
}
退回本部门;
}
更新

另外,如果使用标准输入
系统,则不必关闭
扫描仪
(感谢您指出)。

您有一个无休止的
while(true)
循环,您从未中断。看起来您的while循环将关闭您的扫描仪,并使用它关闭您的System.in stream。一旦资源关闭,您将无法再次打开该资源。在循环中,您从未更改部门。因此,我将条件更改为while(this.department==null)它似乎只适用于案例1-4。如果我输入一个随机值而不是1-4,它会打印出“请选择一个有效选项(1-4)”即使我在sysout下面放了一个break语句,也是无限的。@DexterM。你需要多花一点时间阅读你的代码。拿出一支笔和一张纸,然后跟着做,如果有帮助的话。然后你会发现while循环的内部永远不会改变department-你确实是
department=sc.nextInt()
只有在while循环开始之前。计算机只是按照命令去做,它不会试图智能地理解你的意思。它会按照你说的去做,而不是你的意思。@DexterM。它应该是pal,因为当你输入一个不在1-4范围内的值时,这个部门就不会被赋值。所以它总是空的,所以你可以这样做r condition this.department==null总是正确的。这就是为什么你有一个无限循环。这是一个错误的建议;你不应该关闭扫描仪,因为它会关闭System.in。情况正好相反:通常,你应该关闭资源。System.in是不同的;不仅“你应该关闭它”是不正确的,反之亦然这是真的:你根本不应该关上它。