簡體   English   中英

java Integer.parseInt() 行為怪異

[英]java Integer.parseInt() acting weird

所以我一直在研究一個服務器-客戶端程序,客戶端向服務器發送一個字符串,服務器拆分該字符串以執行某些計算。

//消息樣本

18011d5651,0,348,1649520496736,5,0:1010,1

然后消息存儲在一個名為 msg 的字符串中

當我嘗試在服務器端運行以下行時:

int d = Integer.parseInt(msg.split(",")[4]); 

它返回錯誤如下

Exception in thread "main" java.lang.NumberFormatException: For input string: "5"
  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 test.test1.main(test1.java:54)
C:\Users\xxxx\AppData\Local\NetBeans\Cache\8.2\executor-snippets\run.xml:53: Java returned: 1
BUILD FAILED (total time: 9 seconds) ```

問題解決了

.replaceAll("\0", "")

我將數據從客戶端發送到代理再到服務器,所以在代理中,它讀取 1000 個字節,並將其中的數據附加到最后一個元素“5”,然后附加代理添加的部分(, 0:1010,1) 所以有 834 個空值。 使用上面的行,我在將消息轉發到服務器之前替換了代理中消息中的所有空值,然后添加了代理部分,然后將其發送到服務器,處理成功。

解決它的另一種方法是在服務器端從中刪除空值,但是如果服務器緩沖區是 1000 字節,我們也會遇到問題,因為代理附加部分不會被傳送。 直到我將服務器中的緩沖區設置為 1100 字節后,我才意識到為什么會這樣。

假設服務器中的緩沖區為1100字節,解決方案如下

String msg = "18011d5651,0,348,1649520496736,5,0:1010,1".replaceAll("\0", "");
int d = Integer.parseInt(msg.split(",")[4]); 
> d = 5
> d.length() = 1

因此,根據您的自我回答,問題是您正在處理的消息字符串中有很多意外的 NUL 字符( '\000' )。

您的解決方案是使用replaceAll刪除所有 NUK。 這是(IMO)次優的,並且可能是不正確的。 有兩個問題:

  1. 您仍在從您的服務器發送消息,這些消息充斥着無意義的 NUL 字符。 這會花費.network 帶寬。 它還會在客戶端消耗CPU 時間,直接是因為額外的數據復制、 replaceAll等,間接是因為您將產生更多垃圾。

  2. 根據您的服務器的實現方式,它可能會在連續消息之間回收其 output 緩沖區而不將其完全歸零。 如果是這種情況,並且消息的長度並不總是相同,那么字符串中可能偶爾會出現非 NUL 字符的垃圾字符。

與其嘗試在客戶端修復此問題,我認為您需要修復服務器,以便它不會發送其中包含垃圾字符的消息。


根據您的后續評論,問題出在接收端。 您正在接收數據報中的數據,而垃圾是由於接收到比數據報大的字節數組。

在這種情況下,您的接收代碼中存在錯誤。 DatagramPacket class 有一個getLength方法,它返回實際接收到的數據的字節數。 您應該在將字節轉換為String的地方使用該值(而不是字節數組大小); 例如

String msg = new String(datagram.getData(), 0,
                        datagram.getLength(), charset);

也許問題是服務器使用不同的字符集編碼。 您可以嘗試將字符集轉換為 UTF-8:

    int d = Integer.parseInt(StringUtils.newStringUtf8(StringUtils.getBytesUtf8(msg.split(",")[4])));

您應該導入 StringUtils:

  import org.apache.commons.codec.binary.StringUtils;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM