2012-03-14 16 views
1

文字列形式のメッセージを受け取る関数があります。 "HTTP/1.1 GET/1/\ n"Javaで文字列を分割する

文字列を3つの小さな部分文字列、バージョン、コマンド、および数値に分解するには、java.String.splitメソッドを使用しています。次に、部分文字列からoringal文字列を再構成して出力します。

しかし、私はプログラムの範囲外のArrayIndexで結果tehの機能を実行すると:1、それでも適切に機能。私は、デバッガ(NetBeansの)ステップによって、プログラムステップを実行するときしかし、このプログラムは、通常の

として境界nonesenseや機能のうち、ArrayIndexで任意の提案を発生しないのですか?

サム

String output = ""; 

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

EDITはい、プログラムがマルチスレッド化され、clientMsessage文字列は、 "HTTP/1.1 GET/1/\ n" はすべての時間を含んで、clientMessage FO値が変わることはありません。 clientMessageは、クライアントプログラムから送信された後、サーバー上で処理文字列であり、出力はEHクライアントTOTバックSNETですが、私は、配列エラー

+0

'clientMessage'何ですか?多くの場合、デバッグ時のトレースと通常の実行時の動作の違いを見ると、データ競合の指標となります。**あなたのプログラムはマルチスレッドですか**特に、それは非同期的に 'clientMessage'を生成しますか? – amit

+0

私の推測では、あなたのclientMessage値は実行の間で異なっていると思います。両方の実行で値を出力して、clientMessageが同じであることを確認します。 – gorjusborg

+0

clientMessageの期間はどのくらいですか?クライアントメッセージに十分なトークンがない場合、command = tokens [1]を実行するとArrayIndexOutOfBounds例外が発生します – CodeBlue

答えて

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/< ouput> HTCPCP/1.0 PROPFIND/1/< clientMessage>< – Samishalt

+0

したがって、空のクライアントメッセージがあります。あなたのリクエストはあなたのテンプレートとは非常に異なるようです。 –

0

申し訳ありませんが、これは実際には間違っているとのコメントが、その多くのコードを配置するには小さすぎるものを見つけるための答えが、ただ、追加質問ではありません。私のために、次の作品は、あなたのasumptionsのように一つが間違っている:それは私の側でOK走る

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); 

    } 

}