2012-05-02 7 views
0

3行のテキストを返すWebサーバー上のPHPスクリプトにgetリクエストを送信します。私はこのようなラインパースたより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スクリプトを使っていろいろな行のテキストと別の構文解析を使って同様のメソッドを使っています。返された行をログに記録して、サーバから正常に返されたかどうかを確認すると、PHPスクリプトが送信する行と同じ行になります。

ここは楽しい部分です。私はかなり辛抱強く成長していたとき、私はラインを使ってラインを測定しようとしました:

int l = line.length(); 

これは私のラインで11を返しました。私は単純に使用して何かを表示しようとしたとき、より:

line.charAt(5); 

それはStringIndexOutOfBoundsExceptionを投げた:5.私は本当にこれで間違っているのか分かりません。誰にもアイデアはありますか?ありがとう!

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

最初のループでは、最後の文字ではない少なくとも1つの '_ 'を含む文字列を渡すだけですか?しかし、2番目のビットは説明できません: -/ – Rup

+1

実際には、部分文字列を抽出しようとする前に、indexOfの結果と1と1の長さを比較する必要があります。 –

答えて

4

ほとんどのindexOf -1を返しline.substring(0, -1);StringIndexOutOfBoundsException

EDITをスロー:

EDITは

これは、これは私のJavaコードであるPHPスクリプト

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

です
1_485963行の後に目に見えない文字/行を読み込んでいる可能性はありますか?

入力を想定し、このようなものです:

1_485963\n\n 

は、次にログにあなただけの1_485963が、2回目のループは、それがクラッシュしていました走る見るであろう。

+0

ときにそれはインデックスの文字は、私は文字列に位置しているチャットの文字ですか?そして、これはまた、単純なcharAtが例外をスローする理由を説明しません。文字列の真ん中にcharを要求しているだけです。 –

+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 =文字列lenをを告げたし、5位に文字を印刷すると、スローエラーの時を避けるために、これを試してみてください。

郵便番号5の印刷文字と印刷文字の間で何をしているかを確認します。

最後に、バッファ入力ストリームから迷惑メールを受け取ることがあります。 be/becozがn/wから抜ける。それもチェックしてください。

+0

が解決されていますが、文字列の '_'を見ることができないため、すべてのデータがifステートメントで破棄されるため、これを解決できません。それはそこにある。しかし、データを別々の行に送信して解決したので、解析する必要はありません。私が言ったように、同じアプローチを別の場所で使用していて、それはすべてうまく動作します。 –

0

たぶん私は古いものと盲目取得していますが、どのようにこの

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

1_485963 

きっと

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

は何が必要です生み出すん。 それは有効なPHPでない場合の謝罪その の構文は、常に私の脳にこだわることを拒否しています。

+0

はい、あなたは正しいです、私は別の行に行く私のスクリプトの新しいバージョンを貼り付けました行に '_'を挿入する代わりに –

関連する問題