使用do / while循环错误检查用户输入

时间:2014-11-24 01:35:14

标签: java if-statement methods do-while

嗨,我在完成家庭作业时遇到了麻烦。该程序使用两种不同的方法来平均和显示用户定义的数字集。我想出了所有这些,但我在错误检查方面遇到了困难。我不希望用户能够说他们想要在开头平均负数或零数量,所以我尝试使用if / else语句和do while循环向用户显示错误消息并给他们选择再试一次。

当用户输入1以在输入无效号码后再次尝试该程序时,该程序允许用户再次尝试。然而,一旦他们正确地输入所有内容并完成程序,程序就会重新开始。我希望程序在程序正确完成后结束。

任何帮助将不胜感激。谢谢!

public static void main(String[] args)
{
    //Defining the variables in main method
    int inputNumber;
    int repeat = 0;

    //Creating the array and checking for negative or no numbers using do..while and if..else
    do
    {
        String aStr = JOptionPane.showInputDialog(null, "How many numbers would you like to be averaged?");
        inputNumber = Integer.parseInt(aStr);

            if(inputNumber <= 0)
            {
                String errorStr = JOptionPane.showInputDialog(null, "Cannot be a negative number or a zero. Press 1 to try again.");
                repeat = Integer.parseInt(errorStr);
            }
            else
            {
                double[] array = new double[inputNumber];
                displayAverage(average(array));
            } 
    } while (repeat == 1);
} // end main

// Creating a method called "average" that calculates and returns the average to main
public static double average(double [] methodArray)
{
    // Defining variables in average method
    int index;
    double total = 0;
    double average;

    // Taking user inputed numbers and adding them up
    for(index = 0; index < methodArray.length; index++)
    {
        String bStr = JOptionPane.showInputDialog(null, "Enter number " + (index + 1));
        methodArray[index] = Double.parseDouble(bStr);

        total = total + methodArray[index];
    }
    // Calculating the average
    average = total/index;
    return average;
} //end average method

// Creating a method called "displayAverage" that displays the average in a dialog box
public static void displayAverage(double returnedAverage)
{
    JOptionPane.showMessageDialog(null, "The average of all your numbers is " + returnedAverage);
}

} //结束课

4 个答案:

答案 0 :(得分:1)

似乎在用户再次尝试并输入有效输入后,您永远不会更改repeat的值,因此循环将永远不会退出。如果else在循环中if-else,则需要将repeat重新分配给1以外的其他内容,以便循环退出!

答案 1 :(得分:0)

要循环直到获得有效输入,请尝试以下操作:仅当输入有效时才将validInput布尔值设置为true。

boolean validInput = false;
while (!validInput) {
    //get input from user
    if (userInputIsValid) { //however this is done
        validInput = true;
    }
}

答案 2 :(得分:0)

你必须做这样的事情:

    boolean repeat = false;

    do
    {
        String aStr = JOptionPane.showInputDialog(null,
                "How many numbers would you like to be averaged?");
        try
        {
            inputNumber = Integer.parseInt(aStr);
            if (inputNumber <= 0)
            {
                JOptionPane.showMessageDialog(null,
                    "Input must be a number greater than zero. Try again.",
                    "ERROR: Invalid input", JOptionPane.ERROR_MESSAGE);
                repeat = true;
            }
            else
            {
                double[] array = new double[inputNumber];
                displayAverage(average(array));
            }
        }
        catch (NumberFormatException e)
        {
            JOptionPane.showMessageDialog(null,
                    "Input must be a numeric string. Try again",
                    "ERROR: Invalid input", JOptionPane.ERROR_MESSAGE);
            repeat = true;
        }

    } while (repeat);

需要try / catch来处理无效的数字字符串,如空白文本字段或其他非数字字符。

您可能还想要包含其他逻辑来处理取消按钮。

答案 3 :(得分:0)

虽然在给出正确(我相信是)答案的情况下还有另一个答案,但我想详细说明一下。

这是伪代码:

do {
    inputNumber = getInput();
    if(inputNumber <= 0) {
        displayErrorMessage();
        repeat = 1;       // your logic makes no sense when people input non-1
    } else {
        calculateAverage(inputNumber);
    }    
} while (repeat == 1)

问题非常明显:一旦您收到无效inputNumber,就会设置repeat = 1,导致do-while循环再次继续。然而,之后,即使用户输入有效的inputNumberrepeat仍然保持为1,并且每次点击while(repeat ==1)时,它仍将评估为真。

我强烈建议您学习以基本方式使用调试器,以便您可以跟踪代码,即使输入有效数字,也可以通过查看问题来轻松识别问题,因为repeat总是1。

另一个建议是重写一下你的代码,以便更容易理解。你可以把这些东西写成:

,而不是命名那些没有任何意义的重复
boolean inputIsValid= false;
do {
    inputNumber = getInput();

    inputIsValid= verifyInput(inputNumber);

    if ( inputIsValid) {
       calculateAverage(inputNumber);
    } else {
       displayErrorMessage();
    } 
} while ( ! inputIsValid)

流程,imho,更直观。

这只是第一步。您甚至可以更好地将get输入逻辑包装在一个单独的方法中,以便主逻辑看起来像:

inputNumber = getInput();
calculateAverage(inputNumber);

然后将循环放在getInput()中。看起来更清楚不是吗?