2011-03-10 3 views
4

Надеюсь, очень простой запрос, но это оставило меня почесывать мою голову.Ошибка NumberFormatException (parseInt)

У меня есть строка, которая представляет собой только одно целое число, и я пытаюсь затем получить это целое число как int. Это на первый взгляд не должно быть проблемой.

// this is how I create the string (it's the playload from a UDP datagram packet, 
// thought I don't think the origins hugely important - it's juts a test run so the 
// stringMessage is always 1 (created by a seperate client process) 

    ... 
    recvSoc.receive(pac); 
    String stringMessage = new String(pac.getData()); 
    port = pac.getPort(); 
    System.out.println("RECEIVED: " + stringMessage + " on port: " + port); 
    processMessage(stringMessage); 
    ... 

// Then in processMessage 

public void processMessage(String data) { 
    int message; 
    message = Integer.parseInt(data); 
    ... 

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

Exception in thread "main" java.lang.NumberFormatException: For input string: "1" 
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) 
at java.lang.Integer.parseInt(Integer.java:481) 
at java.lang.Integer.parseInt(Integer.java:514) 
at udp.UDPServer.processMessage(UDPServer.java:85) 
at udp.UDPServer.run(UDPServer.java:52) 
at udp.UDPServer.main(UDPServer.java:156) 
+1

Напечатайте наш персонаж по символу и посмотрите, что там смешно. – iluxa

ответ

4

Обратите внимание, что DatagramPackate.getData() возвращает всего буфер!

Данные, которые вы получили только часть его:

полученные данные или данные, которые должны быть отправлены, начинается с offset в буфере, и работает в течение длительного length.

Таким образом, чтобы преобразовать данные в String вы должны использовать this constructor:

String message = new String(pac.getData(), pac.getOffset(), pac.getLength(), "UTF-8"); 

Обратите внимание, что я указать кодировку UTF-8 здесь, не указывая кодировку приведет к кодированию платформы по умолчанию для быть использованным, который обычно не то, что вы хотите.

+0

Perfect - я понял, что 0s испортили все это (я предположил, что когда метод parseInt() достиг 0, он просто остановится, рассматривая его как a/0), поэтому получил обходной путь, используя цикл, но это очень приятно - очень ценим! – Alex

5

Если строка действительно 1, исключения не могут быть. Поэтому я бы сказал, что строка на самом деле не 1.

выполните data.toCharArray() и распечатайте код каждого персонажа (отрисуйте до int). Может показаться, что перед цифрой есть скрытый символ. (Редактирование: оказывается Iluxa упомянул этот вариант в комментариях, пока я писал ответ)

Try data = data.trim() перед передачей его parseInt(..)

+0

Так вот что я думал, но когда я вывожу этот массив, все, что я получаю, это массив, содержащий один элемент в ноль, который равен 49 (1), а затем остальные пустые (0). Я могу отправить разные числа вместо 1 и снова, я получаю это число, как вы ожидали бы в виде ряда символов ascii, которые соответствуют правильному числу, а затем 0s. Есть какой-то нулевой символ в Java, который, возможно, метод getData забыл? – Alex

+1

@ash - у вас не должно быть нулей после 1. См. Обновленный. – Bozho