5

非常に単純なクエリであるといいのですが、頭を悩ませてしまいました。

単一の整数である文字列があり、その整数を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)
4

2 に答える 2

5

文字列が true の場合1、例外は発生しません。したがって、文字列は実際にはありません1

aを実行し、data.toCharArray()各文字のコードを出力します (にキャストint)。たとえば、数字の前に隠し文字があることが判明する場合があります。(編集:私が答えを書いているときに、iluxaがコメントでこのオプションについて言及したようです)

data = data.trim()に渡す前に試してくださいparseInt(..)

于 2011-03-10T23:41:55.067 に答える
4

バッファ全体DatagramPackate.getData()を返すことに注意してください!

受け取ったデータはその一部です。

受信したデータまたは送信するデータはoffset、バッファ内のから始まり、length長時間実行されます。

したがって、データを に変換するには、次のコンストラクターStringを使用する必要があります。

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

ここでは UTF-8 エンコーディングを指定していることに注意してください。エンコーディングを指定しないと、プラットフォームのデフォルト エンコーディングが使用されることになり、これは通常、希望するものではありません。

于 2011-03-11T07:52:36.713 に答える