Как мне сделать проверку ввел ли пользователь число, а не текст
Как мне сделать проверку ввел ли пользователь число, а не текст ( код там где я ввожу degrees или вторая try/catch ) и пользователь должен вводить до тех пор пока не введет число.
Code:
import java.util.Scanner;
public class main {
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
int numbers;
int degrees;
int exit ;
System.out.print("Hello,");
while (true){
System.out.print(" write number of type convert: \n 1-Degrees Celsius To Fahrenheit \n 2-Degrees Fahrenheit To Celsius \n Number: ");
try{
numbers = cin.nextInt();
while (true)
if(numbers != 1 | numbers != 2 ){
System.out.println("Write right number ( 1 or 2 )");
numbers = cin.nextInt();
if (numbers ==1 | numbers == 2){
break;
}
}
}
catch (Exception e){
System.out.println("Please write number ,not text");
numbers = cin.nextInt();
}
System.out.println("Write degrees: ");
while (true){
try{
degrees = cin.nextInt();
}catch (Exception e){
System.out.println("Please write number,not text");
degrees = cin.nextInt();
}
break;
}
}
}
}
Ответы (2 шт):
После нескольких ответов на ru.SO у меня выбработалось правило большого пальца:
Никогда не используйте
nextInt(nextDouble, или другиеnext...) в интерактивном вводе.
Считывайте строку целиком (nextLine()) и преобразуйте в к нужному типу (Integer.parseInt):
private static int readInt(Scanner s, String prompt) {
while (true) {
System.out.print(prompt);
String line = s.nextLine();
try {
return Integer.parseInt(line);
} catch (NumberFormatException e) {
System.err.println("Error: wrong integer");
}
}
}
Чем плох nextInt? Тем что в случае ошибки, весь ошибочный текст остаётся в сканере так как будто чтения не было вообще. Если вы ещё раз вызовете nextInt, он снова попытается прочитать тот же мусор. У вас есть эта ошибка: при вводе неверных градусов программа зациклится навсегда. Мусор в случае ошибки нужно убирать вызовом next.
Если пользователь введёт несколько целых на одной строке ввода, nextInt считает первое число и передаст управление дальше. Если дальше есть ещё ввод он будет работать с остатком строки. Для пользователя это выглядит как то, что программа печатает приглашения на ввод, не даёт ввести данные и продолжает работу. Или позже сообщает об ошибках там где никакого ввода не было.