2015-04-15 2 views
2

Когда я запускаю этот код Java:java.lang.NumberFormatException: Для ввода строки: «5

public void run(){ 
    String stringPacketData=null; 
    try { 
     stringPacketData = new String(clientPacketData,"UTF-8"); 
    } catch (UnsupportedEncodingException e) { 
     e.printStackTrace(); 
     System.exit(1); 
    }  
    String[] splitString=stringPacketData.split("@"); 
    this.clientID = Integer.parseInt(splitString[0]); 
    String op=""; 

    op=splitString[1]; 
    if(op.equalsIgnoreCase("popola_cache")){ 
     popolamentoCache(Integer.parseInt(splitString[2])); 
    } 
    else{ 
     System.exit(0); 
    } 
} 

Где stringPacketData имеет формат: idClient @ operationType @ dimCache, он будет бросать эту excpetion:

Exception in thread "Thread-2" java.lang.NumberFormatException: For input string: "5" 
at java.lang.NumberFormatException.forInputString(Unknown Source) 
at java.lang.Integer.parseInt(Unknown Source) 
at java.lang.Integer.parseInt(Unknown Source) 
at UDPSocketBased.WorkerUDP.run(WorkerUDP.java:53) 

WorkerUDP.java:53 утверждение соответствует: popolamentoCache (Integer.parseInt (splitString [2]));

Я не могу понять, почему моя строка ввода "5" является не в правильном формате.

+1

Распечатайте номер и проверьте, что отображается. '5' или что-то вместе с' 5' – TheLostMind

+1

Возможно ли, что синтаксическая строка содержит некоторые непечатаемые символы? Можете ли вы напечатать все кодовые точки всех своих символов, например 'System.out.println (Arrays.toString (yourString.chars(). ToArray()))' (если у вас есть доступ к Java 8. – Pshemo

+2

Вы проверили длина строки, которую вы обрабатываете? Непечатаемый символ может вызвать исключение, не будучи видимым в сообщении. –

ответ

0

Прежде всего, необходимо обрезать строку, прежде чем пытаться разобрать его

this.clientID = Integer.parseInt(splitString[0].trim()); 
+0

Это хороший подход, но обрезка не удаляет некоторые специальные символы – Alex

+0

a trim - пример, вы можете использовать регулярное выражение для извлечения чисел между символами @, и я думаю, что в этом случае лучше – bmscomp

0

Я решаю это таким образом:

popolamentoCache(Integer.parseInt(String.valueOf(splitString[2].charAt(0)))); 

Проблема заключалась в том, что я получил DatagramPacket под названием «ПКТ»:

byte[] buffer=new byte[65508]; 
DatagramPacket pkt = new DatagramPacket(buffer, buffer.length); 

Так что, когда я получаю мои данные пакета с:

clientPacketData=pkt.getData(); 

он считает длину полезной нагрузки 65508 байт, так же, как и длину stringPacketData.

Спасибо!

-1

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