有时循环打印两次

时间:2015-12-25 09:38:26

标签: java

在我的convertEuro方法中,for循环导致输出打印两次,但有时只打印。我的意思是这是显示的内容:

Converting values to Euros.
£4.00 >>> €5.45
£123.44 >>> €168.13
Converting values to Euros.
£4.00 >>> €5.45
£123.44 >>> €168.13

在测试过程中,它似乎可以在10次中执行2次,但我无法弄清楚原因。以下代码,如果有人可以请求帮助:

    import java.util.Scanner;
import java.text.DecimalFormat;
import java.util.ArrayList;
public class Conversion {

    public void mainMenu(Scanner scan, ArrayList<Double> values, DecimalFormat twoDecimal) {

        int menuChoice;

        System.out.println("1. Enter values and type -1 to stop");
        System.out.println("2. Euros");
        System.out.println("3. Dollars");
        System.out.println("4. Yen");
        System.out.println("5. Rupees");
        System.out.println("6. Exit");

        menuChoice = scan.nextInt();

        switch (menuChoice) {
        case 1:

            enterValues(scan, values, twoDecimal);

        case 2:

            scan.nextLine();
            convertEuro(scan, values, twoDecimal);

        }

    }

    public void enterValues(Scanner scan, ArrayList<Double> values, DecimalFormat twoDecimal) {
        double value = 0;

        do {
            System.out.print("Enter value. Enter -1 to stop: £");



            while (!scan.hasNextDouble()) {
                System.out.print("Please enter a double (£xx.xx): £");
                scan.nextLine(); //Consumes \n
                scan.next();
            }

            value = scan.nextDouble();

            if (value != -1) {
                values.add(value);
                System.out.println("Value entered.");
            }

        }
        while (value != -1);


        System.out.println("Returning to main menu. ");
        mainMenu(scan, values, twoDecimal);

    }

    public void convertEuro(Scanner scan, ArrayList<Double> values, DecimalFormat twoDecimal) {

        System.out.println("Converting values to Euros.");

        for (int i = 0; i < values.size(); i++) {
            System.out.println("£" + twoDecimal.format(values.get(i)) + " >>> " + "\u20ac" + twoDecimal.format(values.get(i) * 1.362));
        }
    }

    public static void main(String[] args) {

        Conversion conv = new Conversion();
        Scanner scan = new Scanner(System.in);
        ArrayList<Double> values = new ArrayList<Double>();
        DecimalFormat twoDecimal = new DecimalFormat("0.00");

        conv.mainMenu(scan, values, twoDecimal);

        scan.close();

    }

}

2 个答案:

答案 0 :(得分:5)

您需要添加break;声明:

case 1:
    enterValues(scan, values, twoDecimal);
    break;

答案 1 :(得分:1)

switch语句遇到正确的情况时,它会执行它并继续执行其他情况,直到并且除非它达到break语句。

正确的过程是

 switch (menuChoice) {
        case 1:
            enterValues(scan, values, twoDecimal);
            break;
        case 2:
            scan.nextLine();
            convertEuro(scan, values, twoDecimal);
            break;
        }

这就是为什么最佳做法是在每个案例结束后放置break语句。

谢谢