Есть ли у java int.tryparse, который не генерирует исключение для плохих данных?

Возможный дубликат:
Java: хороший способ инкапсулировать Integer.parseInt()
как преобразовать строку в float и избежать использования try/catch в java?

С# имеет Int.TryParse: Метод Int32.TryParse(String, Int32%)

Самое замечательное в этом методе заключается в том, что он не генерирует исключение для плохих данных.

В java, Integer.parseInt("abc") выдаст исключение, и в тех случаях, когда это может произойти, пострадает большая производительность.

Есть ли способ обойти это как-то для тех случаев, когда производительность является проблемой?

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

Ответ 1

Нет. Вы должны сделать свой собственный, как это:

boolean tryParseInt(String value) {  
     try {  
         Integer.parseInt(value);  
         return true;  
      } catch (NumberFormatException e) {  
         return false;  
      }  
}

... и вы можете использовать это так:

if (tryParseInt(input)) {  
   Integer.parseInt(input);  // We now know that it safe to parse
}

РЕДАКТИРОВАТЬ (на основе комментария @Erk)

Что-то вроде следующего должно быть лучше

public int tryParse(String value, int defaultVal) {
    try {
        return Integer.parseInt(value);
    } catch (NumberFormatException e) {
        return defaultVal;
    }
}

Если вы перегрузите это с помощью метода с одним строковым параметром, это будет еще лучше, что позволит использовать его со значением по умолчанию, являющимся необязательным.

public int tryParse(String value) {
    return tryParse(value, 0)
}

Ответ 2

Apache Commons имеет IntegerValidator класс, который, как представляется, делает то, что вы хотите. Java не предоставляет встроенный метод для этого.

Ответ 3

Изменить - просто просмотрел ваш комментарий о проблемах с производительностью, связанных с потенциально плохим количеством входных данных. Я не знаю, как try/catch на parseInt сравнивается с регулярным выражением. Я бы предположил, что, основываясь на очень незначительных знаниях, регулярные выражения не очень эффективны по сравнению с try/catch в Java.

Во всяком случае, я бы просто сделал это:

public Integer tryParse(Object obj) {
  Integer retVal;
  try {
    retVal = Integer.parseInt((String) obj);
  } catch (NumberFormatException nfe) {
    retVal = 0; // or null if that is your preference
  }
  return retVal;
}