【问题标题】:Switch statement returning wrong [duplicate]Switch语句返回错误[重复]
【发布时间】:2016-08-09 19:01:14
【问题描述】:

前段时间我开始学习 Java,我想制作一个可以在终端上运行的计算器。最近我添加了一个数组列表来存储历史记录,然后出了点问题。 计算器程序:

import java.util.Scanner;
import java.util.ArrayList;

public class calc_case {
    public static void main(String[] args) {
        System.out.println("Welcom to The Calculator!");
        double a;
        double b;
        double c;
        Scanner input0;
        int input = 0;
        ArrayList<Double> history = new ArrayList<Double>();
        while (input != 6) {
            try {Thread.sleep(2000);} catch(InterruptedException ex) {Thread.currentThread().interrupt();}
            a = 0; b = 0; c = 0; input = 0;
            System.out.println("#################################################");
            System.out.println("How can I help you?");
            System.out.println("1-Add\n2-Subtrackt\n3-Devide\n4-Multiply\n5-Show history\n6-Exit");
            input0 = new Scanner(System.in);
            input = input0.nextInt();
            switch (input) {            
                case 1: //add
                    System.out.println("Input two numbers:");
                    input0 = new Scanner(System.in);
                    a = input0.nextDouble();
                    input0 = new Scanner(System.in);
                    b = input0.nextDouble();
                    c = a + b;
                    System.out.println("Calculating... \nThe answer is: " + c );
                    break;
                case 2: //subtrackt
                    System.out.println("Input two numbers:");
                    input0 = new Scanner(System.in);
                    a = input0.nextDouble();
                    input0 = new Scanner(System.in);
                    b = input0.nextDouble();
                    c = a - b;
                    System.out.println("Calculating... \nThe answer is: " + c );
                    break;
                case 3: //devide
                    System.out.println("Input two numbers:");
                    input0 = new Scanner(System.in);
                    a = input0.nextDouble();
                    input0 = new Scanner(System.in);
                    b = input0.nextDouble();
                    c = a/b;
                    System.out.println("Calculating... \nThe answer is: " + c );
                    break;
                case 4: //multiply
                    System.out.println("Input two numbers:");
                    input0 = new Scanner(System.in);
                    a = input0.nextDouble();
                    input0 = new Scanner(System.in);
                    b = input0.nextDouble();
                    c = a*b;
                    System.out.println("Calculating... \nThe answer is: " + c );
                    break;
                case 5: //history
                    for (int x = 0; x < history.size(); x++) {
                        System.out.println(history.get(x));
                    }
                case 6: //exit
                    System.out.println("Goodbye!\n Killing process... " + " OK");
                default:
                    history.add(c);
            }
        }
    }
}

将案例 5 添加为“显示历史记录”并在选择选项 5(“显示历史记录”)后将案例 5“退出”移动到案例 6“退出”后,我得到了:

Goodbye!
 Killing process... OK

我尝试重新编译程序,删除类文件,然后将程序粘贴到新文件中。我的程序有什么问题?

  • 操作系统:Ubuntu 16.04 Java 版本:
  • Java 版本:openjdk 版本“1.8.0_91”

【问题讨论】:

  • 案例 5 或 6 没有 break

标签: java


【解决方案1】:

两件事:

  1. 你忘记了case 5之后的break;所以你总是会遇到下一个案例。下一个case 6也是如此。
  2. 您的历史已打印;但是您永远不会为该历史增加价值!如果只读取该变量而从未写入该变量,那么保留历史记录就没有多大意义。

从“干净编码”的角度来看:阅读“单层抽象”原则。您真的不想在一种方法中包含这么多代码;例如:您的每个案例块......应该进入自己的方法。您想创建一眼就能理解的小“单元”。超过 10 行或更多的东西总是比更小的东西需要更多的工作!

你知道的;当每个代码都这样时: ...

case 3: 
  divide();
  break;
case 4:
  multiply();
  break;

你不认为你自己会发现你的问题吗?!

【讨论】:

  • 感谢您不仅回答了问题,还提供了反馈以帮助提问者学习更好的编码方法。
【解决方案2】:

你在case 5中没有break,这就是为什么它在完成case 5后执行case 6

【讨论】:

    【解决方案3】:

    您在case 5: 中的for 循环之后缺少break,因此它落入case 6:

    另外,case 6:System.out 语句之后似乎缺少break

    【讨论】:

      猜你喜欢
      • 2023-03-05
      • 1970-01-01
      • 1970-01-01
      • 2014-06-21
      • 1970-01-01
      • 2013-03-21
      • 2016-01-04
      • 1970-01-01
      • 2020-05-28
      相关资源
      最近更新 更多