GOOGLE ADS

четверг, 14 апреля 2022 г.

Привет, я новичок в Java. Я столкнулся с проблемой при попытке поймать InputMismatchException

Привет, я новичок в Java. Я создал задачу, которая может определить возрастную группу человека, который вводит любое число своего возраста, используя операторы if и else if, но с предварительным условием, что ввод даты не может быть ничем иным, как числами. Чтобы достичь этого условия, я попытался поймать InputMismatchException. Тем не менее, я столкнулся с проблемой при попытке поймать InputMatchException. Что я хотел сделать, так это то, что когда вводимые данные не являются числами, следующая программа выводит сообщение об ошибке только один раз: «Ошибка ввода. Пожалуйста, введите число, соответствующее вашему возрасту». Однако и это сообщение об ошибке, написанное мной, и следующая ошибка произошла при тестовом запуске программы.

 "Input error. Please enter the number corresponding to your age.
Exception in thread "main" java.util.InputMismatchException
at java.base/java.util.Scanner.throwFor(Scanner.java:939)
at java.base/java.util.Scanner.next(Scanner.java:1594)
at java.base/java.util.Scanner.nextDouble(Scanner.java:2564)
at Welcome.main(Welcome.java:11)"

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

Мой код выглядит следующим образом:

import java.util.InputMismatchException;
import java.util.Scanner;
public class Welcome {
public static void main(String[] args) {
System.out.println("Please enter your age and we will define your age group.");
double age;
while (true) {
Scanner input = new Scanner(System.in);
try {
age = input.nextDouble();
} catch (InputMismatchException e) {
System.out.println("Input error. Please enter a number corresponding to your age.");
}
age = input.nextDouble();
if (age <= -1)
System.out.println("It is impossible for negative values to hold true.");
else if (age <= 0.1)
System.out.println("You are a newborn.");
else if (age <= 1)
System.out.println("You are an infant.");
else if (age <= 3)
System.out.println("You are a toddler.");
else if (age <= 5)
System.out.println("You are a preschooler.");
else if (age <= 13)
System.out.println("You are a school-aged child.");
else if (age <= 19)
System.out.println("You are an adolescent and a denarian.");
else if (age <= 29)
System.out.println("You are a vicenarian.");
else if (age <= 39)
System.out.println("You are a tricenarian.");
else if (age <= 49)
System.out.println("You are a quadragenarian.");
else if (age <= 59)
System.out.println("You are a quinquagenarian.");
else if (age <= 69)
System.out.println("You are a sexagenarian.");
else if (age <= 79)
System.out.println("You are a septuagenarian.");
else if (age <= 89)
System.out.println("You are an octogenarian.");
else if (age <= 99)
System.out.println("You are a nonagenarian.");
else if (age <= 109)
System.out.println("You are a centenarian.");
else if (age <= 150)
System.out.println("You are a supercentenarian.");
else if (age >= 150)
System.out.println("This value is too big to hold true.");
}
}
}


Решение проблемы

Вы получаете doubleзначение дважды и только один раз учитываете возможное несоответствие типов. Так что уберите эту секунду input.nextDouble().

Вы также должны использовать continue;, когда выдается исключение, чтобы текущая итерация немедленно останавливалась и продолжалась со следующей итерацией, что означает, что ваша программа даст пользователю еще один шанс ввести возраст. Кроме того, вы должны перемещать System.out.println("Please enter...")внутри цикла, чтобы пользователь знал, что делать.

public static void main(String[] args) {
double age;
while (true) {
System.out.println("Please enter your age and we will define your age group.");
Scanner input = new Scanner(System.in);
try {
age = input.nextDouble();
} catch (InputMismatchException e) {
System.out.println("Input error. Please enter a number corresponding to your age.");
continue;
}
// if you use double you need to use another condition as age -0.1 would leave a "hole" in your ifs
// < 0
if (age <= -1) System.out.println("It is impossible for negative values to hold true.");
else if (age <= 0.1) System.out.println("You are a newborn.");
else if (age <= 1) System.out.println("You are an infant.");
else if (age <= 3) System.out.println("You are a toddler.");
else if (age <= 5) System.out.println("You are a preschooler.");
else if (age <= 13) System.out.println("You are a school-aged child.");
else if (age <= 19) System.out.println("You are an adolescent and a denarian.");
else if (age <= 29) System.out.println("You are a vicenarian.");
else if (age <= 39) System.out.println("You are a tricenarian.");
else if (age <= 49) System.out.println("You are a quadragenarian.");
else if (age <= 59) System.out.println("You are a quinquagenarian.");
else if (age <= 69) System.out.println("You are a sexagenarian.");
else if (age <= 79) System.out.println("You are a septuagenarian.");
else if (age <= 89) System.out.println("You are an octogenarian.");
else if (age <= 99) System.out.println("You are a nonagenarian.");
else if (age <= 109) System.out.println("You are a centenarian.");
else if (age <= 150) System.out.println("You are a supercentenarian.");
// age can`t be <= 150 at this point (when you correct your bug above), so no need for this condition
else if (age >= 150) System.out.println("This value is too big to hold true.");
}
}

Некоторые замечания по вашему коду:


  • Рассмотрите возможность использования switchинструкции вместо всех файлов else if.

  • Возраст обычно равен a, intно если вы хотите, чтобы он был a double(что тоже хорошо, просто необычно), вам нужно скорректировать условие <= -1для отрицательных значений, иначе вы получите неожиданные результаты, например, для возраста -0.1.

  • Ваше последнее else ifтоже не имеет особого смысла. Вы можете просто использовать elseздесь или еще лучше, просто использовать switch.

  • Вам также следует рассмотреть возможность перехвата других исключений, которые могут возникнуть при использовании сканера, а не только TypeMismatchException.

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

Комментариев нет:

Отправить комментарий

Laravel Datatable addColumn returns ID of one record only

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