【问题标题】:Program to continually ask for double values, using sentinel-controlled loop使用哨兵控制循环不断请求双值的程序
【发布时间】:2020-06-15 08:41:16
【问题描述】:

所以我正在开发一个不断向用户询问双精度值的 Java 程序。我应该使用哨兵控制的循环,哨兵值为-999。在使用 try/catch 块处理 inputMismatchExceptions、ArrayStoreExeptions 和一般异常时,我需要使用 ArrayList。

我目前在输入 -999、应用来自 ArrayStoreExceptions 的重复消息的消息并在 inputMismatchExceptions 之后继续输入后尝试完成程序时遇到问题。

public static void main(String[] args) {
        double d;
        double average;
        double max;
        double min;

        ArrayList<Double> value = new ArrayList<Double>();
        Scanner input = new Scanner(System.in);
        System.out.println("Enter a double value (-999 to exit):");
        d = input.nextDouble();

        while (!value.equals(-999)) {

        try {
            System.out.println("Enter a double value (-999 to exit):");
            value.add(input.nextDouble());


        } catch (InputMismatchException e) {
            System.out.println("That is not a valid double value.");

        } catch (ArrayStoreException e) {
            System.out.println("Duplicate value");
        } catch (Exception e) {
            System.out.println("Error");
        }

        }

    }

【问题讨论】:

  • 一个数组列表永远不会等于双精度数,也许您想针对输入的值进行测试?
  • 如果您想在输入 -999 之前请求 多个 输入,您将需要请求输入 在循环内以及, 或者不是,只是 before 循环。
  • 有没有样品可以给我举个例子?

标签: java exception sentinel inputmismatchexception arraystoreexception


【解决方案1】:
  1. 你正在使用
value.equals(-999)

但 value 是 ArrayList&lt;Double&gt; 而 -999 只是 double (实际上是一个 int)。 您不想检查整个列表是否等于 -999,您只想检查最后输入的值是否为 -999。

  1. 如果您不想允许重复,您应该使用Set,而不是ArrayList

  2. 当您收到 InputMismatchException 时,您需要调用 in.nextLine(),然后再向用户询问另一个 double。这是因为,如果您不调用 in.nextLine(),您的扫描仪仍会尝试读取上次导致异常的相同文本。

以下是对您的代码的(经过大量修改的)更改,它应该可以按您的预期工作: (您可能希望使用 Set 的不同实现,具体取决于您的需要)。

public static void main(String[] args) {
        double d = 0.0; //d is set to some unused starting value so it will compile.
        double average;
        double max;
        double min;

        Set<Double> values = new HashSet<Double>();
        Scanner input = new Scanner(System.in);
        while (true) {
            try {
                System.out.println("Enter a double value (-999 to exit):");
                d = input.nextDouble();
            } catch (InputMismatchException e) {
                System.out.println("That is not a valid double value.");
                input.nextLine();
                continue;

            } catch (Exception e) {
                System.out.println("Error");
                break;
            }
            if(d == -999.)
                break;
            else if(!values.add(d))
                System.out.println("Duplicate value");
        }
        //System.out.println(values);
    }

我还建议您将“value”重命名为“values”,以明确表示它代表多个值。

希望这会有所帮助!

【讨论】:

  • 我需要使用 ArrayList 作为作业的一部分,但谢谢,我应该可以将它用作模板来帮助我解决问题
  • 所以我设法让程序在输入 -999 时结束,并在输入非双精度值时发送错误消息,但现在我只需要弄清楚如何使用 ArrayStoreException 检测重复值跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-11
  • 1970-01-01
  • 1970-01-01
  • 2011-02-14
  • 1970-01-01
相关资源
最近更新 更多