пакет object.myobject;
импортировать java.util.Scanner;
общественный класс CatchTheException { Сканер-сканер = новый сканер(System.in);
void receiveInt(){
System.out.println("please input an int");
try{
System.out.println(scanner.nextInt());
System.out.println("try block wont work");
}catch (Exception e){
System.out.println(e);
System.out.println("the input is wrong, please input again");
receiveInt();
}
}
public static void main(String[] args) {
new CatchTheException().receiveInt();
}
}
Я не знаю, почему блок try не работает, возможно, исключение не перехвачено? Я новичок в try catch. я запускаю и пытаюсь, блок не работает, рекурсия не останавливается, поэтому я получаю исключение stackoverflow
Привет, usuario25443671, я не понимаю, почему вы говорите, что ваш код не работает, если я введу «p», он напечатает java.util.InputMismatchException, ввод неверен, введите int, и если я введу «3», он печать, попытка блока не работает, что вы ожидаете от него на печать?
Вопрос в том, что когда я печатаю «p», код в методе получения Int() вызывается снова и снова, но код в блоке try не запускается, что приводит к исключению StackOverFlowException.
Что мне следует сделать, чтобы подробно очистить символ следующей строки?
какой заголовок.... если вы видите сообщение "the input is wrong, please input again"
, то выполняется блок catch -- если вы не видите "try block wont work"
, то опять же выполняется блок catch, так как nextInt()
не возвращается нормально -- то есть попробуйте -catch перехватывает исключение
Re: «по какой причине блок try не работает»: nextInt()
выдает исключение, поскольку ввод недействителен int
(например, некоторые буквы); System.out.println(scanner.nextInt())
; завершается этим исключением без вызова println()
; блок catch выполняется, печатает "the input is wrong, please input again"
и снова вызывает receiveInt()
; поскольку предыдущий nextInt()
не использовал входные данные, то же самое происходит снова: nextInt()
снова выдает исключение, println(scanner.nextInt())
завершается без печати, выполняется блок catch, ...
ок, спасибо за комментарий, теперь я знаю, что проблема в исключении сканера
Вам нужно убрать receiveInt();
в исключении.
Пример:
while (true) {
try {
System.out.println("Please input an int");
scanner.nextInt();
break;
} catch (InputMismatchException e) {
System.out.println("That isn't an integer");
scanner.next();
}
}
Большое спасибо, это правильный ответ, чтобы избежать такой ситуации, но если вы знаете, по какой причине блок try не работает, сообщите мне.
@CodeNewbie — это потому, что вызов receiveInt()
в блоке исключений вашего кода создаст бесконечную рекурсию, которая быстро приведет к ошибке StackOverflowError.
@CodeNewbie проблема в том, что вы нажимаете клавишу «ввод». Его также рассматривают как персонажа. Это вызывает проблему.
Вот альтернативный способ сделать это:
Scanner scanner = new Scanner(System.in);
String num = "";
while (num.isEmpty()) {
System.out.print("Please enter an integer value: -> ");
num = scanner.nextLine().trim();
/* Is the supplied value a string representation of a
signed or unsigned integer value? */
if (!num.matches("-?\\d+")) {
System.out.println("Invalid Entry (" + num + ")! Try again...\n");
num = ""; // Ensure re-loop
}
}
// Passed entry validation:
int number = Integer.parseInt(num); // Convert string value to Integer type:
System.out.println("Your Number: -> " + number);
Вам необходимо очистить символ следующей строки перед повторным вызовом метода getInt().