java.lang.NumberFormatException при попытке проанализировать обычное допустимое целое число

Что здесь происходит?

Это значение checkSum = "2367122119". И я хотел бы проанализировать это число как целочисленное значение следующим образом:

int ipAddressAsInt = Integer.parseInt(checkSum.trim());

В результате я получаю следующее исключение:

java.lang.NumberFormatException: For input string: "2367122119"
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
    at java.lang.Integer.parseInt(Integer.java:583)
    at java.lang.Integer.parseInt(Integer.java:615)
    at com.example.servlets.RDServlet.doPost(RDServlet.java:40)
    ...

Также то же самое произойдет, если я попробую Long.parseLong(checkSum).

Как это возможно?


person toom    schedule 10.12.2015    source источник
comment
Пожалуйста, покажите короткую, но полную программу, демонстрирующую проблему, в том числе когда вы используете Long.parseLong, имея в виду, что показанное вами значение является слишком большим для int...   -  person Jon Skeet    schedule 10.12.2015
comment
Может быть, вы забыли изменить тип ipAddressAsInt на long и делаете приведение?   -  person s_bei    schedule 10.12.2015
comment
@StefanBeike: в этом случае он не будет компилироваться - вы не можете присвоить значение long переменной int.   -  person Jon Skeet    schedule 10.12.2015
comment
Может быть, изменить название? java.lang.NumberFormatException при попытке проанализировать число больше, чем Integer.MAX_VALUE, как целое число   -  person Erick G. Hagstrom    schedule 10.12.2015
comment
@Jon Skeet: я был быстрее с моим редактированием ;-)   -  person s_bei    schedule 10.12.2015
comment
@StefanBeike: Хорошо, тогда OP все еще не получит того же результата - у них вообще не будет исключения, только усечение до int.   -  person Jon Skeet    schedule 10.12.2015
comment
Хорошо, это правильный вопрос, и я принял ответ. Но почему я получаю минусы за это??? Я не вижу оснований для минуса?! Хотя меня это не волнует, мне интересно, почему люди отрицают нормальный вопрос?   -  person toom    schedule 10.12.2015


Ответы (3)


число слишком велико для int:

@Test
public void testMaxInt() {
    System.out.println(Integer.MAX_VALUE);   

    System.out.println(Integer.MIN_VALUE);   

  }

2147483647

-2147483648

person s_bei    schedule 10.12.2015
comment
Но ОП утверждает, что они получают тот же результат для Long.parseLong. - person Jon Skeet; 10.12.2015
comment
Я тоже этого ожидал, поэтому я попросил у ОП короткий, но полный пример, который предположительно не работает. - person Jon Skeet; 10.12.2015

Число слишком велико для целого числа. Однако с использованием Long это определенно должно работать. Попробуйте это так:

  String checkSum = "2367122119";
  long ipAddressAsInt = Long.parseLong(checkSum.trim());
  System.out.println(ipAddressAsInt);
person eol    schedule 10.12.2015

Число превышает размер контейнера int. Вы можете использовать long, но вам также придется объявить переменную как long:

long ipAddressAsInt = Long.parseLong(checkSum.trim());

по идее должно работать....

person Anton    schedule 10.12.2015
comment
Спасибо за ответ. Однако в случае парсинга IP-адреса таким образом вам действительно не следует его использовать, потому что это создает проблемы, если вы попытаетесь разобрать (например) 0.0.0.0, а также некоторые другие адреса. Подробнее см. здесь: stackoverflow.com/questions/1957637/ - person toom; 11.12.2015
comment
Для IP-адреса массив кажется логичным выбором, но на самом деле все сводится к тому, что вы хотите делать с данными. Массив (вы можете использовать byte или int в качестве типа, если хотите) устранит проблему синтаксического анализа, например, 0.0.0.0, но его будет не так просто обрабатывать и использовать, как одно примитивное значение. Ссылка, которую вы разместили, на самом деле делает это лучше, чем я думал... - person Anton; 11.12.2015