2017-06-02 11 views
0

私は仕事をしようとしています。Java StringOutOfBoundsループ内のエラー

public class Main 
{ 
    public static void main(String[] args) 
    { 
     try 
     { 
      BufferedReader reader = new BufferedReader(new FileReader(args[0])); 
      String line = reader.readLine(); // start with the first line 
      String[] a = new String[3]; 

     a = line.split(" "); 
     int n = a[0].charAt(0) - '0'; 
     int m = a[1].charAt(0) - '0'; 
     int k = a[2].charAt(0) - '0'; 

     DisjointUnionSets dus = new DisjointUnionSets(n); 
     line = reader.readLine(); 
     while(line != null) 
     { 
      String[] b = new String[2]; 
      b = line.split(" "); 
      int tmp1 = b[0].charAt(0) - '0'; 
      int tmp2 = b[1].charAt(0) - '0'; 
      dus.union(tmp1,tmp2); 
      line = reader.readLine(); 
     } 
     reader.close(); 

     // Check if 4 is a neighbour of 1 
     if (dus.find(4) == dus.find(1)) 
      System.out.println("Yes"); 
     else 
      System.out.println("No"); 

     // Check if 1 is a neighbour of 2 
     if (dus.find(1) == dus.find(2)) 
      System.out.println("Yes"); 
     else 
      System.out.println("No"); 
    } 
catch(IOException ex){} 
} 
} 

それはエラーなしでコンパイルが、私はそれを実行しようとすると、TMP1を定義するとき、私は例外を取得:私は0

java.lang.StringIndexOutOfBoundsException:範囲外の文字列のインデックスを私がn、m、およびkを定義するときに、なぜこれが起こらないのかを実際に理解することはできません。私は同じ方法でbを使いますが、少なくともそれは私の考えです。

ありがとうございます!

+0

あなたも入力を与えます –

+0

コードを実行しようとしているコマンドを教えてください? –

+0

私の入力は最初の行に3つの数字があり、次に2つの数字の行になります。数字は1つのスペースで区切られています。 @ニクサスSaxenaあなたが意味するものを正確にはわからないが、私は単にあなたの質問の場合は、ターミナルからJava main input.txtを実行します。 – cgss

答えて

0

nullのチェック以外にも、lineにスペースのみが含まれているかどうかを確認してください。そうであれば、配列bの長さは0になります。

+0

私はチェックしますが、問題はそこにないと思います(そのような行はありません)。とにかくありがとう! – cgss

+0

'while'ループ内にデバッグポイントを設定して、配列' b'の値を調べることもできます。 –

0

line.split(" ")lineの単語が複数の空白で区切られていると、結果配列に空の文字列が表示されます。代わりに

b = line.split("\\s+"); 

を試してください。 1つ以上の空白(+)空白(\s)文字に一致します。

あるインスタンスで問題が発生した理由は、入力の行間の違いです。 1つのスペースが使用された行で、複数のスペースが使用された行をヒットすると、kaboom!ケビン・アンダーソンとアニッシュ・カンチャンIからの両方の答えを組み合わせる

+0

私はそれを打つつもりですが、上記のコメントで指定したとおり、入力には複数の空白が含まれていません。 – cgss

+0

@cgssあなたが入力しているのは確かにあなたの言うとおりですが、これはあなたの直近の状況には役立ちませんが、将来を知るための便利なトリックです。 –

0

はこの思い付いた:

while(line != null && !(line.matches("\\s*"))) 

今では正常に動作し、私は、問題が発生したと想定し、右の最後の行を読んだ後。私は意図したように空の文字列を作成する代わりに空の文字列を作成したと思います。だから私は問題を解決するか、単にそれを隠すかどうかはわかりません。だから私はまだ答えを受け入れていないのです(私はそれらをupvotedしました)

関連する問題