Программа для непрерывного запроса двойных значений, используя сторожевой цикл - PullRequest
0 голосов
/ 03 марта 2020

Итак, я работаю над Java программой, которая постоянно запрашивает у пользователя двойные значения. Я должен использовать дозорный l oop со значением -999. Мне нужно использовать ArrayList при использовании блока try / catch для обработки inputMismatchExceptions, ArrayStoreExeptions и общих исключений.

В настоящее время у меня возникают проблемы при попытке завершить sh программу после ввода -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");
        }

        }

    }

1 Ответ

0 голосов
/ 03 марта 2020
  1. Вы используете
value.equals(-999)

, но значение равно ArrayList<Double>, а -999 - это просто double (на самом деле int). Вы не хотите проверять, равен ли весь список -999, вы просто хотите проверить, было ли последнее введенное значение -999.

Если вы не хотите разрешать дубликаты, вы должны использовать Set, а не ArrayList.

Когда вы получаете 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);
    }

Я бы также порекомендовал вы переименовываете «значение» в «значения», чтобы было ясно, что оно представляет несколько значений.

Надеюсь, это поможет!

...