2012-05-02 42 views
0

我向Web服務器上的php腳本發送獲取請求,該請求返回3行文本。我處理服務器這樣的迴應:Android:令人難以置信的StringIndexOutOfBoundsException

BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); 

比我分析是這樣的線路:

line = ""; 
while ((line = rd.readLine()) != null) { 
    String a = line.substring(0, line.indexOf('_')); 
    String b = line.substring(line.indexOf('_') + 1); 
} 

而這種不斷拋出一個異常StringIndexOutOfBounds,我真的不能明白爲什麼。我已經在我的項目中的其他地方使用類似的方法(使用不同的PHP腳本returnig不同的文本行和不同的解析),它工作得很好。當我記錄返回的行以查看它們是否從服務器正確返回時,它們與PHP腳本發送的行相同。

這裏有趣的部分。當我非常絕望地生長時,我嘗試使用以下方法測量線條:

int l = line.length(); 

並且這返回了11與我的線。不是,我只是嘗試使用顯示的東西:

line.charAt(5); 

它扔了的StringIndexOutOfBoundsException:5。我真的不知道什麼是錯。有人有想法嗎?謝謝!

編輯

這是PHP腳本

$query = mysql_query("SELECT * FROM users"); 
while($row = mysql_fetch_array($query)) { 
    print("{$row['id']}\n{$row['number']}\n"); 
} 

這是我的Java代碼:

while ((line = rd.readLine()) != null) { 
    Log.v("connection - user list", line); //This line logs: 1_485963 
    //But this doesent work 
    String a = line.substring(0, line.indexOf('_')); 
    String b = line.substring(line.indexOf('_') + 1); 
} 
+1

indexOf返回-1,如果它沒有找到的東西。 -1沒有有效的索引。 – zapl

+0

對於你的第一個循環,你是否只傳遞了包含至少一個不是最終字符的'_'的字符串?無法解釋第二位: -/ – Rup

+1

在嘗試提取子字符串之前,您應該將indexOf的結果與1以及1行的長度進行比較。 –

回答

4

最有可能indexOf返回-1,line.substring(0, -1);拋出StringIndexOutOfBoundsException

編輯
難道你可能會在1_485963行後看到一個看不見的字符/行嗎?

假設輸入是這樣的:

1_485963\n\n 

然後在日誌中,你會看到只有1_485963但第二次循環運行它會崩潰。

+0

嗯,但是它怎樣才能返回-1當它的索引即時尋找IS位於字符串?這也沒有解釋爲什麼簡單的charAt拋出一個異常,當我只是問它的字符串中間的字符 –

+0

請張貼整個相關的代碼。你所經歷的事情不應該發生。其他地方一定有問題。 – Caner

+0

我試圖用if(line.length()<1)來保證這一點,但它仍然不起作用。我真的不知道這裏有什麼錯。但我設法通過將數據分別發送到不同的行中來解決這個問題,所以我不必解析它。這現在可行 –

0

先嚐試調試。要不試試這個

我敢肯定,line.indexOf(「_」)是不是在給定的字符串

1)字符串的第一個打印日誌可用,並檢查「_」字符可用。

嘗試這種避免的StringIndexOutOfBoundsException

while ((line = rd.readLine()) != null) { 
if (line.indexOf('_') != -1) { 
    String a = line.substring(0, line.indexOf('_')); 
    String b = line.substring(line.indexOf('_') + 1); 
    }else{ 
    // means that index is not found 
    } 
} 

最後你告訴字符串長度= 11 和第5位字符打印時拋出的錯誤。

檢查你在打印字符串的len和打印字符之間做什麼5。

最後,有時您可能會從緩衝區輸入流中獲取垃圾字符。因爲它從n/w傳遞。檢查也。

+0

這解決了它,但我現在從它沒有得到任何東西,因爲所有的數據都扔在if語句,因爲它只是看不到字符串中的'_',我真的不知道爲什麼,因爲它在那裏。但我通過將數據分開發送來解決它,所以我不必解析它們。爲什麼這對我有用一次,而不是再次,我不知道,就像我說的,我在別處使用相同的方法,它一切正常 –

0

也許是我老了,盲目的,但請問這是怎麼

print("{$row['id']}\n{$row['number']}\n"); 

農產品

1_485963 

當然

print("{$row['id']}_{$row['number']}\n"); 

是你所需要的。 道歉,如果這是無效的PHP作爲該語法 一直拒絕堅持在我的大腦。

+0

是的,你是正確的,我粘貼我的腳本的新版本,我去另一行而不是在行中引入'_' –

相關問題