2011-12-20 13 views
0

ヘルプ配列を終了すると、スレッド "main" java.lang.ArrayIndexOutOfBoundsExceptionで例外が発生し続ける:& &で検索を終了しようとしましたが、ルートの検索に戻ります。私はいくつかのアイデアやこれを修正するための任意の助けが必要になる良いことが必要です!このスニペットでJava配列例外

import java.io.*; 
import java.util.Collections; 
import java.util.List; 
import java.util.ArrayList; 

public class Root_Words {  
    public static void main(String[] args) { 
     String Word; 

     List<String> xList = new ArrayList<String>(); 
     try{ 
      BufferedReader reader = new BufferedReader(new FileReader("Words.txt")); 
      while ((Word = reader.readLine()) != null) { 
       xList.add(Word); 
      } 
     } 
     catch (IOException ioe){ 
      System.out.println("Problem opening input file"); 
     } 

     String[] Words = new String[ xList.size() ]; 
     Collections.sort(xList); 
     xList.toArray(Words); 

     int c; 
     String roots = ""; 

     for(int i = 0; i < Words.length; i++){ 
      c = root(Words[i],Words[i+1]); 

      if(c >= 3 || c <=5){ 
       roots = Words[i]; 
       System.out.printf("%s\n", roots); 

       while(Words[i].startsWith(roots) && i < Words.length){ 
        System.out.printf("%s\n", Words[i]); 
        i++; 
       } 
       i--; 
      } 
     } 
    } 
    public static int root(String a, String b){ 
     int min; 

     if(a.length() < b.length()){ 
      min= a.length(); 
     } 
     else{ 
      min = b.length(); 
     } 
     //return min; 

     int i; 

     i = 0; 
     while (i < min) 
     { 
      if (a.charAt(i) == b.charAt(i)) 
       i++; 
      else break; 

     } 

     return i; 


    } 
} 
+1

「i」が「Words.length - 1」になったら、「i + 1」は何ですか? Java配列は0または1ベースですか?また、13行目を指定する必要があります。さらに一貫してインデントしてください。 –

+1

例外が発生した行を教えてください。私は13をカウントダウンしますが、それは「試行」です。例外トレースバックに上位5つかそれ以上のアイテムを投稿してください。 –

+0

それは行13ではなく、それは実際に行40である while(){ – helloman

答えて

3
for(int i = 0; i < Words.length; i++){ 
    c = root(Words[i],Words[i+1]); 

i = length - 1、次いでi + 1は、配列の範囲を超えてしまう場合。 ii + 1を使用する場合は、ループはlength - 1に停止するはずです。

+0

私はそれを追加してまだ得ている、例外 "スレッドのメイン" java.lang.ArrayIndexOutOfBoundsException:13 \t at RootWords.Root_Words.main(Root_Words.java:40) Javaの結果:1 – helloman

+0

helloman、@ CharlieMartinの答えを見つめてください。上記は確かに問題になりましたが、別の問題を正確に特定しています。あなたのループの内側にあるi ++とi-は、おそらく犯人です。 –

+0

ええ、私は今それを試みています。 – helloman

0

は、並べ替えてみます。

while(Words[i].startsWith(roots) && i < Words.length) 

while(i < Words.length && Words[i].startsWith(roots)) 
+0

それはどのような違いがありますか? – COD3BOY

+0

'&&'はショートカット演算子です。左手側が偽と評価された場合、右手には何もありません。 –

1

にそれはここおそらくです:

for(int i = 0; i < Words.length; i++){ 
    c = root(Words[i],Words[i+1]); 

i==Words.length-1(すなわち、最後の要素で)、[i+1]が範囲外の場合。

0

あなたの問題はここにある:あなたが配列の終わりを過ぎているインデックスi+1に、アクセスしている

for(int i = 0; i < Words.length; i++){ 
    c = root(Words[i],Words[i+1]); // oops! 

はこれを試してみてください:

for(int i = 0; i < Words.length - 1; i++){ 
    c = root(Words[i],Words[i+1]); // oops! 
+0

私は他の人にこの答えを+1しています。メリークリスマス:) – Bohemian

+0

ああダングと私がしたすべてのコメントだった! –

+0

私はそれを試しましたが、まだ同じコードを取得します。スレッド "main" java.lang.ArrayIndexOutOfBoundsExceptionの例外:13 RootWords.Root_Words.main(Root_Words.java:40) エラーを指しているwhile(Words [i] .startsWith(roots)){ – helloman

1

さて、短い答えは、あなたがこののハッシュを作ったということです。私は踏み込んで標準化しました。他の人が指摘したように、while節には問題があります。しかし、また、このコードを見て:

for(int i = 0; i < Words.length; i++){ 
     c = root(Words[i],Words[i+1]); 

     if(c >= 3 || c <=5){ 
      roots = Words[i]; 
      System.out.printf("%s\n", roots); 

      while(Words[i].startsWith(roots) && i < Words.length){ 
       System.out.printf("%s\n", Words[i]); 
       i++; 
      } 
      i--; 
     } 
    } 

あなたは、ループのカップルにインデックスとしてiを使用している、とあなたは場所の上にすべてをインクリメントし、デクリメント終わります。これは決して明らかにならず、ほとんどの場合、エラーの兆候です。

+0

大丈夫なので、変数名を変更してから実行してみるべきですか?それ以上の条件を追加する必要がありますか? – helloman

+0

いいえ、私はあなたがバックアップして、あなたが何を意味するかを正確に把握する必要があると思います。あなたが何をしたいのかが分かったら、コードを動作させることができます。 –

+0

私はそれがうまく動作すると思ったので、私は混乱している場所だと思います。私は子供たちの根を印刷しようとしています。ランニング、ランニング、ランナー、ランニング。私が見なければならないどんな考え? – helloman