Java - проверка, выдает ли parseInt исключение

Мне интересно, как что-то сделать, только если Integer.parseInt(независимо) не терпит неудачу.

В частности, у меня есть jTextArea значений, указанных пользователем, разделенных разрывами строк.

Я хочу проверить каждую строку, чтобы увидеть, можно ли преобразовать ее в int.

Придумал что-то вроде этого, но это не работает:

for(int i = 0; i < worlds.jTextArea1.getLineCount(); i++){
                    if(Integer.parseInt(worlds.jTextArea1.getText(worlds.jTextArea1.getLineStartOffset(i),worlds.jTextArea1.getLineEndOffset(i)) != (null))){}
 }

Любая помощь приветствуется.


person Mike Haye    schedule 23.06.2011    source источник
comment
просто обработайте NumberFormatException.   -  person Bala R    schedule 23.06.2011
comment
Возможный дубликат Что такое NumberFormatException и как его исправить это?   -  person xenteros    schedule 23.10.2016


Ответы (8)


Проверьте, является ли он целочисленным синтаксическим анализом.

public boolean isInteger(String string) {
    try {
        Integer.valueOf(string);
        return true;
    } catch (NumberFormatException e) {
        return false;
    }
}

или используйте Сканер

Scanner scanner = new Scanner("Test string: 12.3 dog 12345 cat 1.2E-3");

while (scanner.hasNext()) {
    if (scanner.hasNextDouble()) {
        Double doubleValue = scanner.nextDouble();
    } else {
        String stringValue = scanner.next();
    }
}

или используйте Регулярное выражение, например

private static Pattern doublePattern = Pattern.compile("-?\\d+(\\.\\d*)?");

public boolean isDouble(String string) {
    return doublePattern.matcher(string).matches();
}
person Kerem Baydoğan    schedule 23.06.2011
comment
+1 за проверку без исключений с помощью Сканера. - person Pascal Kesseli; 31.03.2014

Это было бы что-то вроде этого.

String text = textArea.getText();
Scanner reader = new Scanner(text).useDelimiter("\n");
while(reader.hasNext())
    String line = reader.next();

    try{
        Integer.parseInt(line);
        //it worked
    }
    catch(NumberFormatException e){
       //it failed
    }
}
person Stefan Bossbaly    schedule 23.06.2011

parseInt выдаст NumberFormatException, если не может разобрать целое число. Таким образом, это ответит на ваш вопрос

try{
Integer.parseInt(....)
}catch(NumberFormatException e){
//couldn't parse
}
person Amir Raminfar    schedule 23.06.2011
comment
Это должен быть правильный ответ, так как принятый ответ неверен. - person Luís Henriques; 25.06.2018

Вы можете использовать сканер вместо try-catch:

Scanner scanner = new Scanner(line).useDelimiter("\n");
if(scanner.hasNextInt()){
    System.out.println("yes, it's an int");
}
person dogbane    schedule 23.06.2011

Вы можете использовать оператор try..catch в java, чтобы захватить исключение, которое может возникнуть из Integer.parseInt().

Пример:

try {
  int i = Integer.parseint(stringToParse);
  //parseInt succeded
} catch(Exception e)
{
   //parseInt failed
}
person Yet Another Geek    schedule 23.06.2011
comment
Почему минус? Это правильный ответ, и хотя перехват исключений слишком расплывчат для хорошей практики, он сработает. - person josh.trow; 23.06.2011
comment
@josh.trow, создание исключения при выполнении синтаксического анализа также является плохой практикой, поскольку на самом деле это не что-то действительно исключительное, можно либо предоставить анализируемый метод (чтобы проверить, можно ли его проанализировать), либо преобразовать его в странное значение (например, Руби и перл) - person Yet Another Geek; 23.06.2011
comment
Так для чего же исключение? - person user207421; 24.06.2011

вместо выражений trying и catching.. лучше запустить регулярное выражение для строки, чтобы убедиться, что это действительное число..

person Anantha Sharma    schedule 23.06.2011
comment
Лучше как? Зачем изобретать велосипед? Зачем рисковать тем, что регулярное выражение не соответствует тому, что делает parseInt()? Зачем тратить время и деньги? - person user207421; 24.06.2011
comment
когда возникает исключение, возникают накладные расходы (для JVM) для подготовки трассировки стека, а затем продолжения выполнения программы (это занимает немного времени)... всегда лучше проверить выражение перед его разбором.. - person Anantha Sharma; 24.06.2011
comment
Накладные расходы незначительны, как и другие вопросы, которые я поднял. Ваше общее заявление не поддерживается. - person user207421; 24.06.2011
comment
7 лет спустя, и никто не понял этого - обвинения в «опрометчивых заявлениях» не помогают. Если производительность критична, необходимо провести сравнение двух методов. Ни подготовка регулярного выражения, ни трассировки стека не являются полностью незначительными. И на самом деле регулярное выражение может быть кэшировано. - person Adam; 14.12.2018

Вы могли бы попробовать

NumberUtils.isParsable(yourInput)

Он является частью org/apache/commons/lang3/math/NumberUtils и проверяет, может ли строка быть проанализирована Integer.parseInt(String), Long.parseLong(String), Float.parseFloat(String) или Double.parseDouble(String).

Смотри ниже:

https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/math/NumberUtils.html#isParsable-java.lang.String-

person Siddhartha Ghosh    schedule 12.01.2018

person    schedule
comment
Не перехватывайте ВСЕ исключения. Это действительно плохая практика. - person Amir Raminfar; 23.06.2011
comment
Исключение ФорматЧисла. Вы также можете получить это право. Это задокументировано. - person user207421; 24.06.2011
comment
это будет работать ТОЛЬКО с этим конкретным оператором try/catch или любым другим исключением NumberFormatException. - person ; 12.09.2016
comment
Не перехватывайте ВСЕ исключения. Это очень плохая практика. В данном случае это совершенно нормально и правильно, потому что вы всего лишь проверяете, не пошло ли что-то не так. Перехватывайте все исключения и регистрируйте их. - person Kerem Baydoğan; 24.01.2019
comment
Перехват ВСЕХ исключений никогда не бывает правильным, так как единственные исключения, которые ожидаются здесь, - это те, которые выдает parseInt. Если что-то еще пойдет не так, вы не захотите, чтобы программа продолжала работать (скажем, нелегальное исключение доступа, потому что кто-то испортил отражение) - person DownloadPizza; 11.05.2020