2

大家好,我已经尝试回答这个问题好几个小时了:
编写一个程序,要求用户输入一组浮点值。当用户输入一个不是数字的值时,给用户第二次输入该值的机会。两次机会后,退出阅读输入。添加所有正确指定的值并在用户输入数据后打印总和。使用异常处理来检测不正确的输入。

我尝试了一些不同的东西,但我总是遇到同样的问题。一旦输入不是数字的东西,程序就会输出提示输入另一个输入的消息,但是没有给出机会,也就是说,在 1 个不正确的输入之后,它会打印该消息并直接跳到打印总和。我能做的最好的就是在下面我只是不确定如何解决这个问题。任何帮助是极大的赞赏。

import java.util.Scanner;
import java.util.InputMismatchException;
public class q6{
public static void main(String[] args){
    Scanner in = new Scanner(System.in);
    boolean firstChance = true;
    boolean secondChance = true;
    double sum = 0;
    while (secondChance){
        try{
            while (firstChance){
                try{
                    System.out.print("Please enter a number: ");
                    double input = in.nextDouble();
                    sum = sum + input;
                }
                catch (InputMismatchException ex){
                    firstChance = false;
                }
            System.out.print("Please enter a number to continue or something else to terminate: ");
            double input = in.nextDouble();
            sum = sum + input;
            firstChance = true;
            }
        }
        catch (InputMismatchException e){
            secondChance = false;
        }
    }
    System.out.print("The sum of the entered values is " + sum);
}
}
4

7 回答 7

0

当您遇到“错误”输入时,您需要打破循环。然后,您需要再次设置为true,这样您就可以访问第二个,您还需要一个计数器来计算尝试次数(我将其命名为):whilefirstChancewhilechances

int chances = 0;
while (secondChance){
    firstChance = true;
    try{
        while (firstChance){
            try{
                System.out.print("Please enter a number: ");
                double input = in.nextDouble();
                sum = sum + input;
            }
            catch (InputMismatchException ex){
                chances ++;
                in = new Scanner(System.in);
                firstChance = false;
            }
            if(!firstChance && chances < 2)
                break;
            if(chances >= 2) {
                System.out.print("Please enter a number to continue or something else to terminate: ");
                double input = in.nextDouble();
                sum = sum + input;
                firstChance = true;
            }
        }
    }
    catch (InputMismatchException e){
    secondChance = false;
    }
}
于 2013-03-14T06:10:44.393 回答
0

由于将输入解析为 double 不成功,因此扫描仪不会越过给定的输入。从javadoc 扫描仪

将输入的下一个标记扫描为双精度。如果下一个标记无法转换为有效的双精度值,此方法将抛出 InputMismatchException。如果翻译成功,扫描仪会前进超过匹配的输入

由于翻译不成功,所以不前进。因此,在 catch 块中,您可以调用in.next()来跳过令牌。

于 2013-03-14T06:11:38.660 回答
0

我只是不确定如何解决这个问题

伪代码可能如下:

BEGIN

    MAX_INPUT = 2;
    i = 0;

    WHILE i < MAX_INPUT

        TRY
            num = GET_NUM();
        CATCH
            continue;
        FINALLY
            i++

    END WHILE

END
于 2013-03-14T06:14:15.740 回答
0

您可以使用整数计数器而不是布尔变量 firstChance 和 secondChance 并执行以下操作:

int attempts = 0;
while(attempts < 2) {
    try {
        //Get user input - possible exception point
        //Print sum
    } catch(InputMismatchException e) {
        attempts++;
        //Continue?
    }
}
于 2013-03-14T06:14:25.430 回答
0
import java.util.*;

public class q6 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        double inputNumber, sum = 0.0;
        int correctCount = 0, wrongCount = 0;

        while(wrongCount <=1) {
            System.out.println("Please enter a numeric floating value:");
            try {
                inputNumber = in.nextDouble();
                correctCount++;
                sum += inputNumber;
                if(correctCount >= 2)
                    break;
            } catch(InputMismatchException e) {
                wrongCount++;
                in = new Scanner(System.in);
                continue;
            }
        }
        System.out.println(sum);
    }
}
于 2013-03-14T06:16:26.213 回答
0

正如我的评论中所述,为了不处理 Scanner 错误读取,最好使用Scanner#nextLine()并读取数据 as String,然后尝试将其解析为doubleusing Double#parseDouble(String),因为此方法已经抛出NumberFormatException并且您可以处理此错误。此外,您的代码最好可以处理 1 个以上的请求(如果您的老师或其他人要求这样做):

final int REQUEST_TIMES = 2;
double sum = 0;
for(int i = 1; i <= REQUEST_TIMES; i++) {
    while (true) {
        try {
            if (i < REQUEST_TIMES) {
                System.out.print("Please enter a number: ");
            } else {
                System.out.print("Please enter a number to continue or something else to terminate: ");
            }
            String stringInput = in.nextLine();
            double input = Double.parseDouble(stringInput);
            sum += input;
        } catch (NumberFormatException nfe) {
            System.out.println("You haven't entered a valid number.");
            break;
        }
    }
}
于 2013-03-14T06:25:57.153 回答
0

逻辑是读取一次输入,如果正确则显示总和,否则再次读取输入并在输入正确时显示总和。

public class q6 {

    static int trial = 0;

    public static void main(String[] args) {
        double sum = 0;

        while (trial <= 2) {
            Scanner in = new Scanner(System.in);
            try {
                trial++;
                System.out.print("Please enter a number: ");
                double input = in.nextDouble();
                sum = sum + input;
                trial=3;
            } catch (InputMismatchException ex) {
                trial++;
                if (trial == 4){
                    System.out.println("You have entered wrong values twice");
                }
            }
        }
        if (trial <= 3){
            System.out.print("The sum of the entered values is " + sum);
        }
    }

上述程序只是一个粗略的想法,您可以对其进行改进以适应您的需要。

于 2013-03-14T06:49:06.077 回答