2012-03-14 177 views
1

我有一個接受字符串形式的消息的函數。消息如下所示:「HTTP/1.1 GET/1/\ n」在Java中拆分字符串

我一直在使用java.String.split方法將字符串分解爲三個較小的子字符串,版本,命令和編號。然後我重新構造子串中的正弦字符串並輸出它。

但是,當我運行teh函數時,程序導致ArrayIndex超出界限:1,但仍然正常工作。但是當我在調試器(netbeans)中一步一步地運行程序時,程序不會導致ArrayIndex超出界限無意義和功能正常

有什麼建議嗎?

山姆

String output = ""; 

     String[] tokens = clientMessage.split(" "); 
     String version = tokens[0]; 
     String command = tokens[1]; 
     String potNum = tokens[2]; 
     output = version + " " + command + " " + potNum; 

編輯肯定的,程序是多線程的,在clientMsessage字符串包含 「HTTP/1.1 GET/1/\ N」 的時候,FO clientMessage值不會改變。 clientMessage是從客戶端程序發送的字符串,然後在服務器上處理,輸出是snet回到客戶端,但我不斷收到陣列錯誤

+0

是什麼'clientMessage'?通常情況下,如果您在跟蹤調試期間和正常運行期間看到行爲差異,則表示數據競爭,**是程序多線程?**,具體而言,它是否會異步生成'clientMessage'? – amit 2012-03-14 13:04:02

+0

我的猜測是你的clientMessage值在運行之間是不同的。通過在兩次運行中輸出值來驗證clientMessage是否相同。 – gorjusborg 2012-03-14 13:04:13

+0

clientMessage有多長時間?如果客戶端消息中沒有足夠的令牌,那麼當您執行命令=令牌時,您將獲得ArrayIndexOutOfBounds異常[1] – CodeBlue 2012-03-14 13:04:46

回答

0

ArrayIndexOutOfBounds在訪問沒有任何值的數組的索引時出現意味着在您的情況下令牌[1]不存在。調試時你使用相同的字符串作爲輸入?

2

我建議您打印/記錄您的輸入。當你調試你的程序時,我懷疑你正在做一些不同的事情。它有可能在您第一次調用它時起作用,但當它再次調用時,它會失敗。

在分割之前添加。

System.out.println("clientMessage >" + clientMessage +"<"); 

如果你的輸出看起來像

clientMessage >HTCPCP/1.0 PROPFIND /1/< 
clientMessage >HTCPCP/1.0 PROPFIND /1/< 
clientMessage >< 

看樣子你有一個空的請求消息。我想這意味着客戶端不會發送更多的請求,你必須以不同的方式處理。

+0

輸出:clientMessage> HTCPCP/1.0 PROPFIND/1/< 輸出> HTCPCP/1.0 PROPFIND/1/< clientMessage>< – Samishalt 2012-03-14 14:52:04

+0

所以你有一個空的客戶端消息。您的請求看起來與您的模板非常不同。 – 2012-03-14 18:19:20

0

對不起,這不是一個答案,但只是一個額外的問題,以發現什麼是真正的錯誤和評論太小,把這麼多的代碼。以下爲我的作品,所以你的一個假設是錯誤的:

import java.io.IOException; 

public class Main { 

    public static void main(String[] args) throws IOException { 
     String clientMessage = "HTTP/1.1 GET /1/ \n"; 
     String[] tokens = clientMessage.split(" "); 
     String version = tokens[0]; 
     String command = tokens[1]; 
     String potNum = tokens[2]; 
     System.err.println(version + " " + command + " " + potNum); 

    } 

} 
0

它運行在我身邊。我將不得不猜測,有時clientMessage是一個值不包含足夠的空間分成3部分。

0

也許有更多的代碼比你在這裏包括。我將你的代碼放在一個類中,如下所示,它編譯並運行時沒有錯誤。有什麼遺漏嗎?

public class Andrew { 
    public static void main(String args[]) { 
    String output = ""; 
    String clientMessage = "HTTP/1.1 GET /1/ \n"; 

     String[] tokens = clientMessage.split(" "); 
     String version = tokens[0]; 
     String command = tokens[1]; 
     String potNum = tokens[2]; 
     output = version + " " + command + " " + potNum; 

    System.out.println(output); 

    } 

}