切换语句返回错误

时间:2016-08-09 19:01:15

标签: java

我不久前开始学习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”

3 个答案:

答案 0 :(得分:6)

两件事:

  1. 您忘记case 5之后的中断;所以你总是陷入下一个案例。下一个case 6
  2. 也是如此
  3. 您的历史记录已打印;但你永远不会为那段历史增添价值!保留历史记录没有多大意义,如果该变量只是从中读取,但从未写入。
  4. 来自&#34;清洁编码&#34;透视:阅读&#34;单层抽象&#34;原理。你真的不希望在一个方法中有这么多代码;例如:你的每个案例块......应该进入自己的方法。你想创建小型单位&#34;这一点可以理解。超过10行或更多的东西总是需要比更小的东西更多的工作!

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

    case 3: 
      divide();
      break;
    case 4:
      multiply();
      break;
    
    你不觉得自己会发现自己的问题吗?!

答案 1 :(得分:2)

案例5中没有中断,这就是在完成案例5后执行案例6的原因

答案 2 :(得分:1)

break中的for循环后,您遗漏了case 5:,因此它会落入case 6:

此外,在case 6:声明后,break似乎缺少System.out