Исключение при преобразовании string в int

307
05 марта 2017, 06:31
String UNP;
Scanner in = new Scanner(System.in);
UNP = in.next();
    if(Integer.parseInt(UNP) > 1 && Integer.parseInt(UNP) <= 21)
        out.println("\n      Объект выбран\n");
    else 
        out.println("\n      Ошибка выбора объекта\n");

При вводе строки состоящей не только из цифр происходит ошибка.

Exception in thread "main" java.lang.NumberFormatException: For input string: "qq" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) at java.lang.Integer.parseInt(Integer.java:580) at java.lang.Integer.parseInt(Integer.java:615) at Levchenko.App.CLIENT_OBJECT.INPUT_UNP(CLIENT_OBJECT.java:44) at Levchenko.App.Main.main(Main.java:8) ------------------------------------------------------------------------ BUILD FAILURE ------------------------------------------------------------------------ Total time: 2.986s Finished at: Fri Mar 03 22:58:41 MSK 2017 Final Memory: 6M/106M ------------------------------------------------------------------------ Failed to execute goal org.codehaus.mojo:exec-maven-plugin:1.2.1:exec (default-cli) on project App: Command execution failed. Process exited with an error: 1 (Exit value: 1) -> [Help 1]

To see the full stack trace of the errors, re-run Maven with the -e switch. Re-run Maven using the -X switch to enable full debug logging.

For more information about the errors and possible solutions, please read the following articles: [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException

Как мне перед преобразованием string в int и проверкой на соответствие диапазону чисел проверить возможность преобразования string в int для сравнения?

do {
    UNP = in.next();
    if(UNP.matches("\\d+")){
        if(Integer.parseInt(UNP) > 1 && Integer.parseInt(UNP) <= 21)
            out.println("      Объект выбран\n");
        else 
            out.println("      Ошибка выбора объекта\n");
   }
   else
       out.println("      Ошибка выбора объекта\n");
   }    
        while(Integer.parseInt(UNP) < 1 || Integer.parseInt(UNP) > 21);

Если введена строка не только с цифрами то условие отрабатывает 1 раз, выводит такую же ошибку и выходит из do while.

Исправил присвоением перед проверкой while.

Answer 1

Можно использовать обработку исключений:

String UNP;
Scanner in = new Scanner(System.in);
UNP = in.next();
try{
    if(Integer.parseInt(UNP) > 1 && Integer.parseInt(UNP) <= 21)
        System.out.println("\n      Объект выбран\n");
    else 
        System.out.println("\n      Ошибка выбора объекта\n");
}
catch(NumberFormatException e){
    System.out.println("\n      Неверный формат\n");
}

Можно добавить функцию, действие которой также заключается в обработке исключений. Получится примерно так:

public static void main (String[] args){
    String UNP;
    Scanner in = new Scanner(System.in);
    UNP = in.next();
    if(isNumber(UNP)){
        if(Integer.parseInt(UNP) > 1 && Integer.parseInt(UNP) <= 21)
            System.out.println("\n      Объект выбран\n");
        else 
            System.out.println("\n      Ошибка выбора объекта\n");
    }
    else
        System.out.println("\n      Неверный формат\n");    
}
public static boolean isNumber(String s) {
    try {
        Integer.parseInt(s);
        return true;
    } catch (NumberFormatException e) {
        return false;
    }
}

Ещё проверить, является ли строка целым (неотрицательным) числом можно с помощью регулярных выражений:

if(UNP.matches("\\d+")){
    if(Integer.parseInt(UNP) > 1 && Integer.parseInt(UNP) <= 21)
        System.out.println("\n      Объект выбран\n");
    else 
        System.out.println("\n      Ошибка выбора объекта\n");
    }
else
    System.out.println("\n      Неверный формат\n");

Для любых целых чисел выражение будет такое:

UNP.matches("-?\\d+")
READ ALSO
Список ListView

Список ListView

Необходимо сделать список из семи дней неделиЯ Id уже дал и нашёл

256
Проверка существования каталога

Проверка существования каталога

Как проверить существует ли каталог?

334
Динамический вызов массивов из xml

Динамический вызов массивов из xml

В xml-файле есть несколько массивов с номерами 0,1,2,3

251
Чтение данных из файла в java

Чтение данных из файла в java

Если в фале в одной строке даны и символы и числа, как правильно считывать данные чтобы была возможность сохранить и int и char отдельноНапример...

250