2011-03-10 2 views
4

바라건 말하면 매우 간단한 쿼리이지만 내 머리를 긁적 거리게됩니다.NumberFormatException error (parseInt)

문자열이 하나의 정수이고 정수로 정수를 얻으려고합니다. 이것에 직면해서는 안됩니다.

// 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() 반환 전체 버퍼을 전달하기 전에

이 시도 data = data.trim()을!

가 데이터를 수신하거나 데이터가 버퍼에 offset에서 시작을 전송하고, 긴 length 동안 실행 :

받은 데이터는 그것의 일부입니다. 에 플랫폼의 디폴트 인코딩 초래 인코딩을 지정하지, 나는 여기에 UTF-8 인코딩을 지정

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

참고 : 그래서

this constructor을 사용해야합니다 String로 데이터를 변환하는 일반적으로 당신이 원하는 것은 아닙니다.

+0

완벽 - 0이 parsInt() 메소드가 0에 이르렀을 때 가정했는데, 0으로 끝났을 때 (예 :/0과 같이 처리했을 때) 루프를 사용하여 해결 방법을 얻었지만, 대단히 감사합니다! – Alex

5

문자열이 실제로 1 인 경우 예외가 발생할 수 없습니다. 그래서 나는 문자열이 실제로는 1이 아니라고 말할 것입니다.

을 입력하고 data.toCharArray()을 입력하고 각 문자의 코드를 인쇄하십시오 (int으로 전송). 예를 들어 숫자 앞에 숨겨진 문자가 있음을 알 수 있습니다. (편집 : 그것은 내가 대답 쓰는 동안 iluxa이 코멘트에이 옵션을 언급 나타납니다) parseInt(..)

+0

그래서 제가 생각한 것입니다. 그러나 그 배열을 출력 할 때는 모두 49 (1)이고 0 인 단일 요소를 포함하는 배열입니다. 나머지는 비어 있습니다 (0). 1 대신에 다른 숫자를 보낼 수 있고, 다시 올바른 숫자와 0으로 매핑되는 일련의 아스키 문자로 예상되는 숫자를 얻을 수 있습니다. Java에서 getData 메소드가 잊어 버린 null 문자가 있습니까? – Alex

+1

@ash - 1 후에는 0이 없어야합니다. 업데이트 된 내용을 확인하십시오. – Bozho