Проверить, является ли строка целым числом (numberFormatException)

Я пытался написать фрагмент кода, чтобы проверить, содержит ли строка целое число. Я знаю о решении try catch, но я читал, что становится плохо, если вы вызываете метод из других классов. Я прочитал, что метод покажет ошибку, но основная часть вызывающего его класса все равно будет продолжать работать. Поэтому я пытался сделать это вручную. Моя проблема в том, что я могу оценить, что строка не пуста и что все символы в строке являются цифрами, но я не могу найти способ проверить, слишком ли велико число для сортировки целого числа. Дело в том, что я нашел на stackoverflow много похожих тем, но никто не решает эту проблему без try catch. Вот мой метод.

// INTEGER VERIFICATION
public static boolean isInteger (String str_input){
    int number_of_digits = 0;
    if (str_input.isEmpty()) {
        JOptionPane.showMessageDialog(null, "No input inserted", "Error", JOptionPane.ERROR_MESSAGE);
        return false;
    }
    for (char c : str_input.toCharArray()){
        if(Character.isDigit(c)){
            number_of_digits++;
        }
    }
    if (number_of_digits == str_input.length()){
        return true;
    }
    else {
        JOptionPane.showMessageDialog(null, "The input is not an integer", "Error", JOptionPane.ERROR_MESSAGE);
        return false;
    }
}

Заранее спасибо за помощь!


person Pezze    schedule 03.08.2014    source источник
comment
использование try catch - самый простой способ, IMO. В противном случае вам придется сравнивать с Integer.MAX_VALUE и Integer.MIN_VALUE и с нулевым значением.   -  person Leo    schedule 04.08.2014
comment
Я думаю, что ваши предположения ошибочны. В подходе try catch нет ничего плохого, кроме того, что он медленный.   -  person Jeremy    schedule 04.08.2014
comment
@Jeremy И я не уверен, что на самом деле это будет медленнее, чем проверки, выполняемые здесь.   -  person Brett Okken    schedule 04.08.2014
comment
Единственная причина, по которой решение try-catch не сообщит вызывающему классу, заключается в том, что y никогда не выдает исключение повторно или иным образом не предоставляет обратную связь от метода о частом значении пригодности. Сказав это, вы не должны принимать решения о ветвлении с исключениями.   -  person MadProgrammer    schedule 04.08.2014
comment
@Jeremy Учитывая, что этот код работает с графическим интерфейсом, скорость обработки исключений будет мгновенной по сравнению с восприятием пользователя.   -  person Dunes    schedule 04.08.2014
comment
Integer.parseInt делает именно то, что вы хотите делать, и делает это хорошо. Он выдает исключение, если ввод не является целым числом, без каких-либо побочных эффектов. В случае сомнений проверьте исходный код: он не такой длинный/сложный и действительно надежный (android.googlesource.com/platform/libcore/+/refs/heads/master/).   -  person Shlublu    schedule 04.08.2014
comment
Существует решение регулярного выражения для этой проблемы (почти дубликат)   -  person Bohemian♦    schedule 04.08.2014


Ответы (3)


Я думаю, что лучший способ сделать это, как указал Лео в комментариях.

public static boolean isInteger(final String strInput) {
    boolean ret = true;
    try {
        Integer.parseInt(strInput);
    } catch (final NumberFormatException e) {
        ret = false;
    }
    return ret;
}

Также я предлагаю вам отделить часть GUI от метода проверки, пусть вызывающая сторона решает, что делать, если ложь (например, может быть, в некоторых ситуациях вы хотите проверить, является ли это целым числом, но не показывать диалог).

person m0skit0    schedule 03.08.2014
comment
Вам не нужен ret, просто верните true после корректного синтаксического анализа или false внутри блока catch. - person Pshemo; 04.08.2014
comment
@Pshemo Я предпочитаю этот способ вместо нескольких возвратов. - person m0skit0; 04.08.2014

Вы можете изменить свой метод, чтобы убедиться, что число соответствует int.

Это можно сделать, проанализировав ввод как long и проверив диапазон чисел int.

// INTEGER VERIFICATION
public static boolean isInteger (String str_input){
    int number_of_digits = 0;
    if (str_input.isEmpty()) {
        JOptionPane.showMessageDialog(null, "No input inserted", "Error", JOptionPane.ERROR_MESSAGE);
        return false;
    }
    for (char c : str_input.toCharArray()){
        if(Character.isDigit(c)){
            number_of_digits++;
        }
    }
    if (number_of_digits == str_input.length()){
        if (str_input.length > 15) // arbitrary length that is too long for int, but not too long for long
            return false;
        long number = Long.parseLong(str_input);
        if (number > Integer.MAX_VALUE || number < Integer.MIN_VALUE)
           return false;
        else
           return true;
    }
    else {
        JOptionPane.showMessageDialog(null, "The input is not an integer", "Error", JOptionPane.ERROR_MESSAGE);
        return false;
    }
}

Кстати, если вы разрешаете отрицательные входные данные, вы должны изменить свою проверку, чтобы разрешить «-» в качестве первого символа.

Тем не менее, я согласен со всеми комментариями, в которых говорится, что вам лучше просто вызвать Integer.parseInt() и перехватить исключение.

person Eran    schedule 03.08.2014