как более конкретно обрабатывать NumberFormatException?

Я хочу обрабатывать NumberFormatException более конкретным образом. Это исключение возникает, когда он пытается присвоить что-либо, кроме целого числа, когда вводится следующее:

  1. нить
  2. символ
  3. пустой ввод
  4. двойной номер

В зависимости от того, что было введено, я хочу отобразить правильное сообщение, например

вы ввели строку, пожалуйста, введите целое число

or

значение не может быть нулевым, введите целое значение

Код ниже улавливает NumberFormatException в общем виде.

Интересно, есть ли способ включить больше предложений catch.

    import java.util.Scanner;

    public class TestException {

        static int input;
        static Scanner scan = new Scanner(System.in);

        public static void main(String[] args) {
            System.out.println("Enter an integer number: ");

            try {
                input = Integer.parseInt(scan.next());
                System.out.println("You've entered number: " + input);
            } catch (NumberFormatException e) {
                System.out.println("You've entered non-integer number");
                System.out.println("This caused " + e);
            }
        }
    }

person Askar    schedule 10.01.2013    source источник
comment
Просто отображать в одинаковых строках Вы ввели либо пустое, либо нечисловое значение. Пожалуйста, попробуйте еще раз ?? лучше правда?   -  person Pradeep Simha    schedule 10.01.2013
comment
Вы можете проанализировать данный ввод в предложении catch, очевидно, что нет встроенной логики для определения различных произвольных причин, по которым строка была недействительной как число.   -  person Esailija    schedule 10.01.2013
comment
Также завершите процесс с кодом ошибки. Система.выход(1);   -  person Vinay Lodha    schedule 10.01.2013
comment
Это может быть излишним, но вы можете использовать регулярное выражение, чтобы увидеть шаблон для того, являются ли они цифрами, алфавитами или комбинацией того и другого.   -  person Smit    schedule 10.01.2013


Ответы (4)


Сначала возьмите ввод от пользователя, а затем попытайтесь преобразовать его в целое число.

    static int input;
    static Scanner scan = new Scanner(System.in);

    public static void main(String[] args) {
        System.out.println("Enter an integer number: ");

        String inputString = scan.next();

        try {
            input = Integer.parseInt();
            System.out.println("You've entered number: " + input);
        } catch (NumberFormatException e) {
            if(inputString.equals("") || inputString == null) {
                System.out.println("empty input"); 
            } else if(inputString.length == 1) {
                System.out.println("char input");
            } else {
                System.out.println("string input");
            }
        }
    }
person İsmet Alkan    schedule 10.01.2013

Вы должны использовать конструкцию if-else, чтобы указать свои сценарии в блоке catch.

См. код ниже:

String inString = null;
try 
{
    iString = scan.next().trim();
    input = Integer.parseInt(inString);
    System.out.println("You've entered number: " + input);
} 
catch (NumberFormatException e) 
{
    if(inString.equals("")
    {
        System.out.println("You've entered empty string.");
    }
    else if(inString.length() == 1)
    {
        System.out.println("You've entered a single char");
    }
    else
    {
        System.out.println("You've entered non-intereger number");
    }
    System.out.println("This caused " + e);
}
person Azodious    schedule 10.01.2013
comment
Я использую Эклипс. Когда я просто нажимаю Enter, это пустая строка, но ваш код не проверяет первое условие, поэтому он переходит к последнему другому условию. - person Askar; 11.01.2013

Вы могли бы выполнить еще несколько тестов на входе, если синтаксический анализ ввода как целочисленного значения вызвал исключение, что-то вроде этого:

String scanned = null
try {
   scanned = scan.next();
   input = Integer.parseInt(scanned);
   System.out.println("You've entered number: " + input);
} catch (NumberFormatException e) {
   if (scanned == null || scanned.isEmpty()) {
      System.out.println("You didn't enter any value");
   } else if (scanned.length() == 1)
      System.out.println("You entered a single char which is not a number");
   }
   // and more tests, you can even try to parse as Double
}
person Andreas Dolk    schedule 10.01.2013
comment
scanned.size() --› scanned.length() - person Askar; 11.01.2013

person    schedule
comment
Это вызовет NumberFormatException без его перехвата и, таким образом, завершит программу (и числовое регулярное выражение тоже неверно). - person jlordo; 10.01.2013
comment
Нет, этого не произойдет, потому что вы больше не конвертируете ввод в int, что и хочет сделать OP. И регулярное выражение по-прежнему неверно. - person jlordo; 10.01.2013
comment
Регулярное выражение уже работает для меня. Просто проверьте регулярное выражение, если вы введете 1000, оно также работает и дает вам правильный o/p. - person ANIL; 10.01.2013
comment
Теперь я вижу, регулярное выражение работает для вас, потому что вы заменяете все запятые. Но тогда ваше регулярное выражение можно было бы написать намного проще, например \\d[\\d,]*. Теперь все, что вам нужно исправить, это область действия переменной input. - person jlordo; 10.01.2013