Рубрики
Без рубрики

Понимание числаФорматИсключаемость в Java

Узнайте о различных причинах создания NumberFormatException на Java и некоторых лучших практиках для ее избежания.

Автор оригинала: baeldung.

1. Введение

Java бросает NumberFormatException – неконтролируемое исключение – когда он не может преобразовать строку в тип числа .

Так как это не контролируется, Java не заставит нас обрабатывать или объявить его.

В этом быстром учебнике мы опишем и продемонстрируем что вызывает NumberФорматЭксцепция в Java и как избежать или справиться с ним .

2. Причины numberFormatException

Существуют различные проблемы, которые вызывают NumberФорматЭксцепция . Например, некоторые конструкторы и методы Java бросают это исключение.

Мы обсудим большинство из них в разделах ниже.

2.1. Ненмерные данные передаются конструктору

Давайте посмотрим на попытку построить Интегер или Двойное объект с неиммерными данными.

Оба эти заявления будут бросать NumberФорматЭксцепция :

Integer aIntegerObj = new Integer("one");
Double doubleDecimalObj = new Double("two.2");

Давайте посмотрим след стека, который мы получили, когда мы передали недействительный вход “один” в Интегер конструктор в строке 1:

Exception in thread "main" java.lang.NumberFormatException: For input string: "one"
	at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
	at java.lang.Integer.parseInt(Integer.java:580)
	at java.lang.Integer.(Integer.java:867)
	at MainClass.main(MainClass.java:11)

Он бросил NumberФорматЭксцепция . Интегер конструктор потерпел неудачу, пытаясь понять вход с помощью parseInt () внутренне.

API Java Number не анализирует слова на числа, поэтому мы можем исправить код, просто изменив его на ожидаемое значение:

Integer aIntegerObj = new Integer("1");
Double doubleDecimalObj = new Double("2.2");

2.2. Разбор строк, содержащих некумерные данные

Подобно поддержке Java для разбора в конструкторе, у нас есть специальные методы разбора, такие как пар seInt (), parseDouble (), valueOf() , и декодировать () .

Если мы попытаемся сделать те же виды преобразования с этими:

int aIntPrim = Integer.parseInt("two");
double aDoublePrim = Double.parseDouble("two.two");
Integer aIntObj = Integer.valueOf("three");
Long decodedLong = Long.decode("64403L");

Тогда мы увидим такое же ошибочное поведение.

И мы можем исправить их аналогичным образом:

int aIntPrim = Integer.parseInt("2");
double aDoublePrim = Double.parseDouble("2.2");
Integer aIntObj = Integer.valueOf("3");
Long decodedLong = Long.decode("64403");

2.3. Прохождение струн с посторонними персонажами

Или, если мы попытаемся преобразовать строку в число с посторонние данные в вводе, такие как whitespace или специальные символы:

Short shortInt = new Short("2 ");
int bIntPrim = Integer.parseInt("_6000");

Тогда у нас будет та же проблема, что и раньше.

Мы могли бы исправить это с помощью немного строки манипуляции:

Short shortInt = new Short("2 ".trim());
int bIntPrim = Integer.parseInt("_6000".replaceAll("_", ""));
int bIntPrim = Integer.parseInt("-6000");

Обратите внимание здесь, в строке 3, отрицательные цифры допускаются , используя символ дефиса в качестве знака минус.

2.4. Форматы локальных номеров

Давайте посмотрим на особый случай локальных номеров. В европейских регионах запятая может представлять собой десятичное место. Например, “4000,1” может представлять десятичное число “4000.1”.

По умолчанию мы получим NumberФорматЭксцепция пытаясь разобрать значение, содержащее запятую:

double aDoublePrim = Double.parseDouble("4000,1");

Мы должны разрешить запятые и избежать исключения в этом случае. Чтобы сделать это возможным, Java должна понимать запятую здесь как десятичную.

Мы можем разрешить запятые для европейского региона и избежать исключения с помощью НомерФормат .

Давайте посмотрим его в действии, используя Локале для Франции в качестве примера:

NumberFormat numberFormat = NumberFormat.getInstance(Locale.FRANCE);
Number parsedNumber = numberFormat.parse("4000,1");
assertEquals(4000.1, parsedNumber.doubleValue());
assertEquals(4000, parsedNumber.intValue());

3. Лучшие практики

Давайте поговорим о нескольких хороших практиках, которые могут помочь нам справиться с NumberФорматЭксцепция :

  1. Не пытайтесь преобразовать алфавитные или специальные символы в числа, – API Java Number не может этого сделать.
  2. Мы можем захотеть проверить входную строку с помощью регулярных выражений и бросить исключение для недействительных символов .
  3. Мы можем дезинфицировать входные данные от предсказуемых известных проблем с такими методами, как отделка () и заменитьВсе () .
  4. В некоторых случаях могут быть действительны специальные символы в входе. Таким образом, мы делаем специальную обработку для этого, используя НомерФормат, например, которая поддерживает многочисленные форматы .

4. Заключение

В этом учебнике мы обсудили NumberФорматЭксцепция на Java и что его вызывает. Понимание этого исключения может помочь нам создать более надежные приложения.

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

Наконец, мы увидели несколько лучших практик для борьбы с NumberФорматЭксцепция .

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