2016-10-28 3 views
-1

У меня проблема с Integer.parseInt(). Конкретно мой код сделать это:NumberFormatException с 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) в первой строке или использовать новый Integer (decodedString [1]). IntValue() в последней строке без успеха.

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

EDIT:

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) 
+0

Мое предположение: вам нужно обрезать свой вход: 'serverPort = Integer.parseInt (decodedString [1] .trim());'. Трудно сказать без stacktrace, который вы не предоставили. – azurefrog

+1

Если 'decodedString [1]' равно '' 1910 ", то' Integer.parseInt' ** не может ** вызывать исключение. Итак, если возникает исключение, что это значит? – Tunaki

+0

Добавлена ​​трассировка стека. С trim() у меня такой же результат. «1910» НЕ равно decodedString [1] –

ответ

0

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

String receivedString = "host::1910"; 

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

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

    System.out.println(serverPort); 

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

String receivedString = "host:: 1910"; 

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

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

    System.out.println(serverPort); 
1

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

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

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

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

+0

Вы увековечиваете путаницу, обращаясь к ASCII, когда строки Java подсчитываются последовательностями кодовых блоков UTF-16. Кроме того, спецификация - это только спецификация в начале потока или файла. Соответствующий читатель не перенесет его в строковое значение, потому что это не данные. (Это не значит, что это может быть исключено как проблема.) Очевидно, что parsetInt не сломан, поэтому, как вы полагаете, ключ должен выяснить, какие кодовые единицы UTF-16 передаются ему. –

0

с использованием раствора, отправленный Джастин L я заметил, что моя строка выглядит как:

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

(0 = пустые пространства?)

, но в любом случае .trim() не влияет.

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

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

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

Смежные вопросы