NumberFormatException с Integer.parseInt ()

У меня проблема с Integer.parseInt (). В частности, мой код делает это:

Переменная serverPort - это int, правильно инициализированный до 1910

byte[] multicastMessage = (serverAddress+"::"+String.valueOf(serverPort)).getBytes();

byte[] receivedBytes = receivePacket.getData();
receivedString = new String(receivedBytes, "UTF-8");

String[] decodedString = receivedString.split("::");            
serverPort = Integer.parseInt(decodedString[1]);

Обратите внимание, что когда я печатаю decodedString [1] в консоли, правильно печатается 1910. Но когда я вызываю Integer.parseInt (), возникает исключение NumberFormatException.

Я также пробовал использовать Integer.toString (serverPort) в первой строке или использовать new Integer (decodedString [1]). IntValue () в последней строке без успеха.

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

РЕДАКТИРОВАТЬ:

Exception in thread "Thread-0" java.lang.NumberFormatException: For input string: "1910"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:580)
at java.lang.Integer.parseInt(Integer.java:615)
at ClientThread.run(ClientThread.java:60)

person Akinn    schedule 28.10.2016    source источник
comment
Я догадываюсь, что вам нужно обрезать ввод: serverPort = Integer.parseInt(decodedString[1].trim());. Трудно сказать без трассировки стека, которую вы не предоставили.   -  person azurefrog    schedule 28.10.2016
comment
Если decodedString[1] равно "1910", тогда Integer.parseInt не может вызвать исключение. Итак, если возникает исключение, что это означает?   -  person Tunaki    schedule 28.10.2016
comment
Добавлена ​​трассировка стека. С trim () я получил тот же результат. 1910 НЕ равно decodedString [1]   -  person Akinn    schedule 28.10.2016
comment
печать decodedString [1] .length ()   -  person xenteros    schedule 02.11.2016


Ответы (3)


Я вижу ваш комментарий о том, что trim () по-прежнему предоставляет NumberFormatException.

Я предполагаю, что где-то есть невидимый символ ASCII, такой как спецификация (знак прощания) в вашей строке. Лучший способ проверить это - запустить строку с помощью следующей функции:

public static String displayCharValues(String s) {
StringBuilder sb = new StringBuilder();
for (char c : s.toCharArray()) {
    sb.append((int) c).append(",");
}
return sb.toString();}

Если имеется спецификация, вы увидите, что 65279 распечатана как часть последовательности. Если ваша строка содержит допустимые числа, вы должны видеть только соответствующие коды ASCII, связанные с числами (http://www.asciitable.com/). Вы должны увидеть строку 1910, распечатанную как 49,57,49,48.

person Justin L    schedule 28.10.2016
comment
Вы усугубляете путаницу, ссылаясь на ASCII, когда строки Java являются подсчитанными последовательностями кодовых единиц UTF-16. Кроме того, спецификация - это только спецификация в начале потока или файла. Соответствующий читатель не перенес бы его в строковое значение, потому что это не данные. (Это не означает, что это может быть исключено как проблема.) Очевидно, что parsetInt не нарушен, поэтому, как вы предлагаете, ключ заключается в том, чтобы выяснить, какие единицы кода UTF-16 передаются ему. - person Tom Blodget; 30.10.2016

Как отметил @azurefrog, это, вероятно, проблема с пробелами. Следующая программа правильно разбирает:

    String receivedString = "host::1910";

    String[] decodedString = receivedString.split("::");

    int serverPort = Integer.parseInt(decodedString[1]);

    System.out.println(serverPort);

Однако, если вы добавите пробел до 1910 года, он выдаст NumberFormatException, как вы указали. Решением было бы использовать String. обрезать, чтобы удалить все пробелы.

    String receivedString = "host:: 1910";

    String[] decodedString = receivedString.split("::");

    int serverPort = Integer.parseInt(decodedString[1].trim());

    System.out.println(serverPort);
person Justin L    schedule 28.10.2016

используя решение, опубликованное Джастином Л. Я заметил, что моя строка выглядит как:

49,57,49,48,0,0,0,0,0,0,0,0,0,0, ...... многие другие 0.

(0 = пробелы?)

но в любом случае .trim () не действует.

Я решил использовать другой формат строки, отправленной моим сервером. Вместо: string + "::" + stringVersionOfInt я использовал: string + "::" + stringVersionOfInt + "::"

теперь моя строка правильно анализируется из Integer.parseInt ()

Это работает! Спасибо всем!

person Akinn    schedule 30.10.2016