Как заставить код работать с try-catch?ИМТ Исключения - PullRequest
0 голосов
/ 07 апреля 2019

Кажется, я не могу попытаться использовать catch в моем коде. Я очень новичок в этом, и я должен использовать это. Мне нужно, чтобы пользователь ввел ввод, а затем мне нужно проверить этот ввод, вероятно, в цикле, на наличие ошибок, которые будут обнаружены исключением.

- Выполните проверку ввода, убедившись, что пользователь вводит положительное целое число для ног, неотрицательное десятичное число для дюймов и положительное десятичное число для веса.

-Дополнительно, ограничьте диапазон значений, введенных логическим диапазоном для каждого значения. Например, при вводе высоты в футах достаточно разумный диапазон будет включать значения от 4 до 7. Ограничьте дюймы и вес таким же образом.

Любая помощь будет высоко ценится! Я чувствую, что прошу много, но я застрял на этом несколько недель: /

Как вы можете видеть в моем коде, я пробовал что-то вроде цикла while с попыткой catch и исключениями.

public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    double weight = 0; //positive decimal number
    int heightFeet = 0; //positive int number for feet
    double heightIn = 0;//nonnegative decimal number for inches
    double BMI;

    System.out.print("Enter height using feet space inches (e.g., 5 6.25): ");
    while(true){
        try {
            heightFeet = Integer.parseInt(in.next());
            heightIn = Double.parseDouble(in.next());
            break;
        }
        catch (Exception e){
            System.out.println("Invalid feet value. Must be an integer.");
            System.out.println("Invalid inches value. Must be a decimal number.");
            System.out.print("Re-enter height using feet space inches (e.g., 5 6.25): ");
        }
    }//end while


    System.out.print("Enter weight in pounds: ");
    while(true){
        try {
            weight = Double.parseDouble(in.next());
            break;
        }
        catch (Exception ex){
            System.out.println("Invalid pounds value. Must be positive.");
            System.out.println("Re-enter weight in pounds: ");
        }
    }//end while


    final int bmi = 704;
    double heightNew = (heightFeet * 12) + heightIn;

    BMI = Math.round(((weight * bmi) / (heightNew * heightNew))); //BMI
    //needs to round up, not down

    //constrain range of values able to be entered
    //feet should be 4-7
    //inches and weight similar

    //end print result
    System.out.println("\nheight = " + heightFeet + "'-" + heightIn + "\"");
    System.out.println("weight = " + weight + " pounds");
    System.out.print("body mass index = " + BMI);

    in.close();
}//end main

Вывод должен выглядеть так:

Введите высоту, используя футы в дюймах (например, 5 6,25): привет
Неверное значение в футах. Должно быть целым числом.
Неверное значение в дюймах. Должно быть десятичным числом.
Повторно ввести высоту, используя расстояние в футах (например, 5 6,25): 0 9
Неверное значение в футах. Должен быть позитивным.
Повторно ввести высоту, используя расстояние в футах (например, 5 6,25): 5,25 0
Неверное значение в футах. Должно быть целым числом.
Повторно ввести высоту, используя расстояние в футах (например, 5 6,25): 5 9,25
Введите вес в фунтах: 0
Неверное значение в фунтах. Должен быть позитивным.
Повторно введите вес в фунтах: 150,5

высота = 5'-9,25 "
вес = 150,5 фунтов
индекс массы тела = 22,1

1 Ответ

0 голосов
/ 07 апреля 2019

Бьюсь об заклад, вы чувствуете, как будто вы так близко, что вы можете попробовать это ... и вы. Что нужно учитывать:

Давайте начнем с приглашения "Enter height using feet space inches (e.g., 5 6.25): ". Лично я не твердо верю в состояние while (true) {. Конечно, его можно использовать, но люди привыкли использовать его все время, и наступит время, когда практика укусят и вызовет головную боль. Так как в любом случае вам необходимо соответствовать определенным ограничениям со всеми входными данными, не мешало бы использовать логический флаг, тогда как, если все входные данные прошли ограничения, выход из цикла while , например:

boolean pass = false;
while (!pass) {
    /* .... Your Prompt Code .... */
}

pass = false;
while (!pass) {
    /* .... Your Other Prompt Code .... */
}

Для переменной heightFeet :

Очевидно, что если для точки маркера, в которой должны быть указаны ноги, указано что-либо, кроме значения Integer, то (1011 * NumberFormatException будет выброшено и перехвачено (this) будет включать числовое значение, которое содержит десятичную точку). Ваше сообщение для консоли отображается с указанием как таковой, и пользователь может повторить попытку, это хорошо. Но если область токена содержит значение меньше 4 или значение больше 7, переменная заполняется этим значением и heightIn Переменная работает на следующем. Пока все хорошо , но имейте в виду, что вам не нужны значения меньше 4 или больше 7.

Для переменной heightIn :

Если следующая точка токена (второе предоставленное значение после предоставленного пробела) является чем-то отличным от целочисленного или двойного числового значения, то снова, NumberFormatException будет брошено и перехвачено, и снова ваше сообщение на консоль отображается с указанием как таковой, и пользователь может попробовать еще раз, это тоже хорошо. Но если эта область токена содержит числовое значение, которое меньше 0.0 (или 0) или больше 11.99, тогда да .... это значение будет добавлено к heightIn переменная. Это тоже хорошо, но сейчас самое время применить желаемые ограничения, прежде чем двигаться дальше. Вы хотите проверить значения, содержащиеся в переменных heightFeet и heightIn , чтобы убедиться, что они удовлетворяют необходимым критериям до выхода из while петля.

Здесь вы можете использовать один или несколько операторов if , чтобы проверить состояние каждой переменной и убедиться, что они соответствуют ограничениям.

/* Is feet greater than 3 and less than 8 (4 to 7) and 
   is inches 0 or greater and less than 12   */
If (heightFeet > 3 && heightFeet < 8 && heightIn >= 0.0d && heightIn <= 11.9375d) {
    // All is Good!
    pass = true;    // set to true so as to exit the while loop.
}
else {
    // Hmmm....something's not right.
    System.out.println("The height supplied (" + hightFeet + " " + 
             heightIn + ") is invalid! Try again:");
}

Конечно, вы бы избавились от оператора break;, он больше не нужен.

Зачем использовать <= 11.9375d как часть условия переменной heightIn ? Длина фута составляет 12 дюймов, поэтому все, что больше 11-15 / 16 дюймов, можно считать 1 футом. Имейте в виду, я не думаю, что кто-то измеряет человека с точностью до 16 дюймов, но на всякий случай. Конечно, это можно уменьшить еще больше, например, до 11,75 (11 и 3 дюйма на дюйм).

Теперь приглашение "Enter weight in pounds: ":

Попробуйте использовать ту же концепцию, что и в предыдущем приглашении:)

...