For input string java error

Понимание исключения NumberFormatException в Java

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

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

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

2. Причины исключения NumberFormatException

NumberFormatException вызывают различные проблемы . Например, некоторые конструкторы и методы в Java вызывают это исключение.

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

2.1. Нечисловые данные, передаваемые в конструктор

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

Оба этих оператора вызовут исключение NumberFormatException :

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

Давайте посмотрим на трассировку стека, которую мы получили, когда передали недопустимый ввод «one» в конструктор Integer в строке 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)

Это вызвало исключение NumberFormatException . Конструктору Integer не удалось внутренне понять ввод с помощью parseInt () .

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

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

2.2. Анализ строк, содержащих нечисловые данные

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

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

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. Передача строк с посторонними символами

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

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

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

Читайте также:  Fps команды для css

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

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

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

2.4. Форматы номеров для конкретных регионов

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

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

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

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

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

Давайте посмотрим на это в действии на примере Locale для Франции:

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

3. Передовой опыт

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

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

4. Вывод

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

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

Наконец, мы увидели несколько передовых методов работы с NumberFormatException .

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

Читайте также:  Bitrix env обновить php

Популярные посты

Источник

Понимание исключения NumberFormatException в Java

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

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

2. Причины исключения NumberFormatException ​

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

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

2.1. Нечисловые данные, переданные конструктору

Давайте рассмотрим попытку создания объекта Integer или Double с нечисловыми данными.

Оба этих утверждения вызовут NumberFormatException :

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

Давайте посмотрим на трассировку стека, которую мы получили, когда передали неверный ввод «один» конструктору Integer в строке 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.init>(Integer.java:867)   at MainClass.main(MainClass.java:11) 

Он выдал NumberFormatException . Конструктор Integer потерпел неудачу при попытке понять ввод с помощью parseInt() внутренне.

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

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

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

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

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

 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. Передача строк с посторонними символами

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

 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».

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

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

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

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

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

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

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

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

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

4. Вывод​

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

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

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

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

Источник

Оцените статью