Работа с объектами и null в Java
Всем привет. Сейчас работаю надо валидацией полей и у меня может быть такое, что в поле Integer могут подать какой-нибудь String abracadabra. Мне бы хотелось чтобы при парсинге строки в Integer не срабатывало исключение, а просто к полю присваивалось значение null. Можно ли это как-то реализовать без try catch?
Если совсем просто: как мне парсить String в Integer, но без вылавливания Exception?
Ответы (2 шт):
Есть ещё такой вариант
public static void main(String[] args) {
String tmp = "abcd";
tmp = tmp.replaceAll("[^0-9]", "");
Integer needed;
if(tmp.isBlank()){
needed = null;
}else{
needed = Integer.parseInt(tmp);
}
System.out.println(needed);
}
Убираем всё, кроме чисел и смотрим, осталось ли что-нибудь
Самый простой способ написать подобную статическую функцию
@Nulluble
static Integer tryParseInt(String value) {
try {
return Integer.parseInt(value);
} catch(NumberFormatException nfe) {
// Log exception.
return null;
}
}
Если вы хотите больше заморочиться, то можно найти в Kotlin-e экстеншен функцию String.toIntOrNull и переписать ее на статический метода в Java
public fun String.toIntOrNull(radix: Int): Int? {
checkRadix(radix)
val length = this.length
if (length == 0) return null
val start: Int
val isNegative: Boolean
val limit: Int
val firstChar = this[0]
if (firstChar < '0') { // Possible leading sign
if (length == 1) return null // non-digit (possible sign) only, no digits after
start = 1
if (firstChar == '-') {
isNegative = true
limit = Int.MIN_VALUE
} else if (firstChar == '+') {
isNegative = false
limit = -Int.MAX_VALUE
} else
return null
} else {
start = 0
isNegative = false
limit = -Int.MAX_VALUE
}
val limitForMaxRadix = (-Int.MAX_VALUE) / 36
var limitBeforeMul = limitForMaxRadix
var result = 0
for (i in start until length) {
val digit = digitOf(this[i], radix)
if (digit < 0) return null
if (result < limitBeforeMul) {
if (limitBeforeMul == limitForMaxRadix) {
limitBeforeMul = limit / radix
if (result < limitBeforeMul) {
return null
}
} else {
return null
}
}
result *= radix
if (result < limit + digit) return null
result -= digit
}
return if (isNegative) result else -result
}