Numberformatexception java что это
Перейти к содержимому

Numberformatexception java что это

  • автор:

Понимание исключения 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 .

NumberFormatException при считывании чисел из файла

Вылетает ошибка NumberFormatException .
При работе с консолью всё работает нормально. Считывает он вроде то что нужно:

public static void main(String[] args) throws IOException < BufferedReader reader1 = new BufferedReader(new InputStreamReader(System.in)); String name = reader1.readLine(); BufferedReader reader = new BufferedReader(new FileReader(name)); String buf = ""; try < while (reader.ready()) < buf = reader.readLine(); System.out.println(Integer.parseInt(buf)); >> catch (Exception e) < System.out.println("Мы считали: " + buf); >> 

Мы считали: 32

Где ошибка?
Отслеживать
19.1k 6 6 золотых знаков 30 30 серебряных знаков 44 44 бронзовых знака
задан 19 фев 2017 в 12:49
125 2 2 серебряных знака 9 9 бронзовых знаков

В stacktrace у NumberFormatException указывается строка, которая приводит к появлению исключения. Проанализируйте её, а также добавьте stacktrace в вопрос.

19 фев 2017 в 13:27

Exception in thread «main» java.lang.NumberFormatException: For input string: «32». Не знаю как добавить это в вопрос

19 фев 2017 в 16:47

В нижней части вопроса, чуть ниже меток, есть кнопка «Править». Нажмите на неё и добавьте весь stacktrace в конец текста вопроса.

19 фев 2017 в 16:54

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

Ошибка возникает, скорее всего, из-за того, что после числа идет пробел или какой-то другой подобный символ. Есть предложение: после считывания строки вызвать для неё метод trim() . Этот метод удаляет пробелы в начале и конце строки.

Тогда парсинг будет выглядеть так:

Integer.parseInt(buf.trim()) 

Отслеживать
19.1k 6 6 золотых знаков 30 30 серебряных знаков 44 44 бронзовых знака
ответ дан 19 фев 2017 в 12:55
14.9k 1 1 золотой знак 21 21 серебряный знак 40 40 бронзовых знаков
trim() не помог. При выводе в консоль buf выводится без пробелов и переносов
19 фев 2017 в 16:51

Если метод trim не справляется с задачей (в частности, он удаляет только символы с кодами от 0 до 32 включительно и только из начала и конца строки), то справиться может replaceAll :

buf = buf.replaceAll("[^0-9]", ""); 

Который удалит из строки все символы, не являющиеся цифрами.

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

private static void displayChars(String str) < for (int i = 0; i < str.length(); i++) < System.out.print((int)str.charAt(i) + " "); >> 

Если System.out.println(«Мы считали: » + buf); заменить на displayChars(buf); , то должно стать понятно что же за символы «портят жизнь».

Таким символом может оказаться 65279 (то есть BOM), находящий в самом начале файла.

Java для чайников. Урок 2 3. Исключение NumberFormatException.

Первое исключение, которое мы изучим, это NumberFormatException. Оно возбуждается при попытке распарсить строку как число, если это строка содержит неверные символы. Для иллюстрации работы этого исключения немножко доработаем пример предыдущего урока:

import java . awt .*;

import java . applet .*;

public class DivisionApplet extends Applet

TextField textField1 , textField2 ;

String answerStr ;

public void init ()

textField1 = new TextField ( 20 );

add ( textField1 );

textField2 = new TextField ( 20 );

add ( textField2 );

answerStr = «» ;

public boolean action ( Event evt , Object arg )

String str1 = textField1 . getText ();

String str2 = textField2 . getText ();

int int1 = Integer . parseInt ( str1 );

int int2 = Integer . parseInt ( str2 );

int answer = int1 / int2 ;

answerStr = str1 + «/» + str2 + «=» + String . valueOf ( answer );

catch ( NumberFormatException e )

answerStr = » Одно из чисел введено неверно » ;

return false ;

public void paint ( Graphics g )

Font font = new Font ( «TimesRoman» , Font . PLAIN , 24 );

g . setFont ( font );

g . drawString ( answerStr , 50 , 100 );

теперь при вводе некорректного числа у нас будет выдано сообщение об ошибке:

Случился казус с java.lang.NumberFormatException: For input string: «».Что делать?

Считываю из файла строку: asdasdasd112 sada 1 123dfdsd
Выбрал только цифры, получилось так: 112 1 123
Пытаюсь убрать лишние пробелы, а у меня выдаёт эту ошибку: java.lang.NumberFormatException: For input string: «»
Ошибка возникает в этой части кода:

1 2 3 4 5 6 7 8 9 10 11 12
int s = 0; int j = 0; ListString> ListChisel = new ArrayListString>(); ListChisel = Arrays.asList(massPosled2); for (int i = 0; i  ListChisel.size(); i++) { if (Character.isSpaceChar(Integer.parseInt(ListChisel.get(i)))){ ListChisel.remove(i); j++; } else{ s++; } }

Но на всякий случай вот весь код:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
package com.company; import java.io.*; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class Main else { } } String chisla = num.toString(); String massPosled[] = chisla.split(" "); String massPosled2[] = new String[massPosled.length]; for (int i = 0; i  massPosled.length; i++) { if (massPosled[i] == "") { } else { massPosled2[i] = massPosled[i]; System.out.println(massPosled2[i]); } } int s = 0; int j = 0; ListString> ListChisel = new ArrayListString>(); ListChisel = Arrays.asList(massPosled2); for (int i = 0; i  ListChisel.size(); i++) { if (Character.isSpaceChar(Integer.parseInt(ListChisel.get(i)))){ ListChisel.remove(i); j++; } else{ s++; } } }finally { if (fileIn != null) { fileIn.close(); } } } }

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *