为什么在使用 if else 语句时需要初始化 totalBill 的值,但在使用 switch case [closed] 时不需要初始化

Why do I need to initialize a value for totalBill when using if else statement but not when using switch case [closed]

提问人:hi hi 提问时间:7/30/2023 更新时间:7/30/2023 访问量:38

问:


这个问题是由错别字或无法再现的问题引起的。虽然类似的问题可能在这里是主题,但这个问题的解决方式不太可能帮助未来的读者。

4个月前关闭。

所以我写了两个程序来做同样的事情。其中一个使用 if-else,而另一个使用 switch-case。

public static void calcBill(String userChoice, int userMinute){
        double PackageArate = 39.99;
        double PackageBrate = 59.99;
        double PackageCrate = 69.99;

        int PackageAmins = 450;
        int PackageBmins = 900;

        double totalBill = 0.0;

        if(userChoice.equals("A")){
            if(userMinute > PackageAmins){
                int extraMins = userMinute - PackageAmins;
                totalBill = PackageArate + (extraMins * 0.45);
            } else {
                totalBill = PackageArate;
            }
        } else if (userChoice.equals("B")){
            if(userMinute > PackageBmins){
                int extraMins = userMinute - PackageBmins;
                totalBill = PackageBrate + (extraMins * 0.40);
            } else{
                totalBill = PackageBrate;
            }
        } else if(userChoice.equals("C")){
            totalBill = PackageCrate;
        } else{
            System.out.print("Invalid input.");
        }
        System.out.printf("Your bill is $%.2f%n", totalBill);
    }
    public static void calcBill(String packageChoice, int minutes){
        double packageArate = 39.99;
        double packageBrate = 59.99;
        double packageCrate = 69.99;
        
        int packageAmins = 450;
        int packageBmins = 900;
        
        double totalBill;
        
        switch(packageChoice){
            case "A":
                if(minutes > packageAmins){
                    int extraMinutes = minutes - packageAmins;
                    totalBill = packageArate + (extraMinutes * 0.45);
                } 
                else{
                    totalBill = packageArate;
                }
                break;
            case "B":
                if(minutes > packageBmins){
                    int extraMinutes = minutes - packageBmins;
                    totalBill = packageArate + (extraMinutes * 0.40);
                } 
                else{
                    totalBill = packageBrate;
                }
                break;
            case "C":
                totalBill = packageCrate;
                break;
            default:
                System.out.print("Invalid choice.");
                return;
            
        }

为什么在使用 if-else 而不是 switch-case 时需要初始化 totalBill 的值。

当我尝试不在 if-else 中初始化 totalBill 的值时,我收到一个错误,说该变量未初始化。

java if-statement 变量 switch-statement

评论

0赞 Paul 7/30/2023
在代码中不使用 .尝试包含代码中的最后一行:switchtotalBillifSystem.out.printf("Your bill is $%.2f%n", totalBill);
0赞 Arfur Narf 7/30/2023
这不会有什么区别 - “默认”返回。因此,任何让你通过 switch 语句的路径都执行了对 totalBill 的赋值。
0赞 Elliott Frisch 7/30/2023
在最后一个(你有的地方 - 注意你在版本中没有。它)然后你的两种方法是等价的,你可以做return;elseSystem.out.print("Invalid input.");defaultswitchbreakreturndouble totalBill;

答:

0赞 Joop Eggen 7/30/2023 #1

最后一种可能遇到未初始化的变量。如果不是在默认值中执行 a,则会遇到相同的问题。printfreturnbreak

1赞 Arfur Narf 7/30/2023 #2

在“if-else”代码中有一条路径,您可以在其中尝试打印出“totalBill”的值,该值从未分配给该值。这是执行最终“else”子句时的路径。

“switch”代码中没有这样的路径。要么分配一个值,要么在打印总计之前从“默认”情况返回。

因此,这两种实现并不等效。只有您知道哪一个具有预期的行为。

-1赞 Glauber Faria 7/30/2023 #3

在这里,编译器指责了一个错误,其中问题本身出在第二个程序没有的指令“System.out.printf(”Your bill is $%.2f%n“,totalBill);”中,当尝试将其添加到第二个程序时,您将得到相同的错误。