Есть ли у 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;
}