在Java中处理异常-如何给用户另一个机会?

在Java中处理异常-如何给用户另一个机会?,java,exception,exception-handling,try-catch,Java,Exception,Exception Handling,Try Catch,嘿,伙计们,我已经试着回答这个问题好几个小时了: 编写一个程序,要求用户输入一组浮点值。当 用户输入的值不是数字,请给用户第二次输入数字的机会 价值两次机会后,停止阅读输入。添加所有正确指定的值和 当用户输入完数据后,打印总和。使用异常处理来检测 输入不正确 我试过几种不同的方法,但我总是遇到同样的问题。一旦输入的不是数字的东西,程序就会输出提示另一个输入的消息,但没有给出机会,也就是说,在输入错误1次后,程序会打印该消息并直接打印总和。我所能做的最好的事情就是,我只是不知道如何解决这个问题。非

嘿,伙计们,我已经试着回答这个问题好几个小时了:
编写一个程序,要求用户输入一组浮点值。当 用户输入的值不是数字,请给用户第二次输入数字的机会 价值两次机会后,停止阅读输入。添加所有正确指定的值和 当用户输入完数据后,打印总和。使用异常处理来检测 输入不正确

我试过几种不同的方法,但我总是遇到同样的问题。一旦输入的不是数字的东西,程序就会输出提示另一个输入的消息,但没有给出机会,也就是说,在输入错误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);
}
}

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

int=0;
while(第二次机会){
第一次机会=正确;
试一试{
虽然(第一次机会){
试一试{
System.out.print(“请输入一个数字:”);
双输入=in.nextDouble();
总和=总和+输入;
}
捕获(输入不匹配异常){
机会++;
in=新扫描仪(System.in);
第一次机会=错误;
}
如果(!firstChance&&chances<2)
打破
如果(机会>=2){
System.out.print(“请输入一个数字继续,或输入其他内容终止:”);
双输入=in.nextDouble();
总和=总和+输入;
第一次机会=正确;
}
}
}
捕获(输入不匹配异常e){
第二次机会=错误;
}
}

由于将输入解析为double未成功,扫描仪不会通过给定的输入。从

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

既然翻译不成功,就不能前进。因此,在catch块中,可以调用跳过令牌

我只是不知道如何解决这个问题

伪代码可以如下所示:

BEGIN

    MAX_INPUT = 2;
    i = 0;

    WHILE i < MAX_INPUT

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

    END WHILE

END
开始
最大输入=2;
i=0;
当i
您可以使用整数计数器代替布尔变量firstChance和secondChance,并执行以下操作:

int attempts = 0;
while(attempts < 2) {
    try {
        //Get user input - possible exception point
        //Print sum
    } catch(InputMismatchException e) {
        attempts++;
        //Continue?
    }
}
int尝试次数=0;
而(尝试次数<2次){
试一试{
//获取用户输入-可能的异常点
//打印金额
}捕获(输入不匹配异常e){
尝试++;
//继续?
}
}
导入java.util.*;
公开课q6{
公共静态void main(字符串[]args){
扫描仪输入=新扫描仪(系统输入);
双输入编号,总和=0.0;
int correctCount=0,ErrorCount=0;
while(错误计数=2)
打破
}捕获(输入不匹配异常e){
错误计数++;
in=新扫描仪(System.in);
继续;
}
}
系统输出打印项数(总和);
}
}

如我在评论中所述,为了不处理扫描仪的错误读取,最好使用
字符串
读取数据,然后尝试使用
双重
解析数据,因为此方法已经抛出,您可以处理此错误。此外,最好您的代码能够处理多个请求(如果您的老师或其他人要求这样做):

final int REQUEST_TIMES=2;
双和=0;

对于(int i=1;i而言,逻辑是读取一次输入,如果输入正确,则显示总和,否则再次读取输入,如果输入正确,则显示总和

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);
        }
    }
公共类q6{
静态int试验=0;
公共静态void main(字符串[]args){
双和=0;

while(试用,而不是读取
double
,读取
String
并使用
double.parseDouble(String)
。此外,如果您的
firstChance
try catch
块之后是
true
,您应该打破
while循环
s。查看您的问题,您似乎知道逻辑,但它没有反映在代码中。我建议您使用测试输入来试着运行此代码,并尝试自己找出问题。您只需要为了确保您的程序在发出错误消息后返回初始提示,请使用异常处理来检测不正确的输入,我猜您忘记阅读问题的这一部分。谢谢这一点,以及在捕获异常后重新初始化扫描仪的其他建议。这不是p再次阅读问题。由于某些原因,在循环外初始化扫描仪无法多次尝试!
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);
    }
}
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;
        }
    }
}
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);
        }
    }