2012-02-09 6 views
3

こんにちは、私は他の言葉で作られた最も長い単語を見つけるためにJavaコードを書いています。私の論理は、テキストファイルから単語のリストを読み取り、各単語を配列に追加することです(テキストでは単語はソートされ、各行には単語が1つしかありません)。その後、配列の各要素にサブストリングとしての他のエレメンツ。もしそうなら、部分文字列の数を数えます。部分文字列の最大数を持つ要素が結果になりますjava.lang.StringIndexOutOfBoundsException:文字列のインデックスが範囲外です

テキストファイルに2語しか入力しないとコードが実行されています。範囲外の文字列のインデックス:3

私は(s.charAt(I1場合は、エラーがこの行で発生していると感じしかし、二つ以上の単語があるとき、私は次のようなエラーに

java.lang.StringIndexOutOfBoundsExceptionを取得しています)== w.charAt(J1))は

import java.util.*; 
    import java.io.*; 
    import java.lang.reflect.Array; 
    public class Parser 
    { 
public static void main (String[] args) throws IOException 
{ 
    String [] addyArray = null; 

    FileReader inFile = new FileReader ("sample.txt"); 
    BufferedReader in = new BufferedReader (inFile); 
    String line = ""; 
    int a = 0; 
    int size=0; 
    String smallestelement = ""; 

    while(in.ready()) 
    { 
     line=in.readLine(); 
     while (line != null && line != "\n") 
     { 
      size++; 
      System.out.println(size); 
      line = in.readLine(); 
      if (line == null) line = "\n"; 
     } 
    } 
    addyArray = new String[size]; 
    FileReader inFile2 = new FileReader ("sample.txt"); 
    BufferedReader in2 = new BufferedReader (inFile2); 
    String line2 = ""; 

    while(in2.ready()) 
    { 
     line2 = in2.readLine(); 


     while (line2 != null && line2 != "\n") 
     { 

      addyArray[a] = line2; 


      System.out.println("Array"+addyArray[a]); 
      line2 = in.readLine(); 
      a++; 
      if (line2 == null) line2 = "\n"; 
     } 

    } 


    int numberofsubstrings=0; 
    int[] substringarray= new int[size]; 

    int count=0,no=0; 

for(int i=0;i<size;i++) 
{  
    System.out.println("sentence "+addyArray[i]); 
    for(int j=0;j<size;j++) 
    { 
     System.out.println("word "+addyArray[j]); 

     String w,s; 
     s=addyArray[i].trim(); 
     w=addyArray[j].trim(); 

     try{ 
      for(int i1=0;i1<s.length();i1++) 
      { 
       if(s.equals(w)&& s.indexOf(addyArray[j-1].trim()) == -1) 
       {} 
      else 
      { 
       if(s.charAt(i1)==w.charAt(0)) 
       {     
        for(int j1=0;j1<w.length();j1++,i1++) 
        { 
        if(s.charAt(i1)==w.charAt(j1)) //I feel the error is occuring here 
        { count=count+1;} 
         if(count==w.length()) 
         {no=no+1;count=0;}; 

        } 
       } 
       } 
      } 
       System.out.println(no); 
     } 
     catch(Exception e){System.out.println(e);} 
     substringarray[i]=no; 
     no=0; 

     } 
    } 



     for(int i=0;i<size;i++) 
     { 
      System.out.println("Substring array"+substringarray[i]); 
     } 
    Arrays.sort(substringarray); 
    int max=substringarray[0]; 

    System.out.println("Final result is"+addyArray[max]+size); 

} 
    } 

答えて

6

これが問題である:ループを介して各反復で

for(int j1=0;j1<w.length();j1++,i1++) 

、あなたはi1インクリメントしていますよくj1となります。 i1は既にsの末尾にある可能性があります。そのため、増分した後はs.charAt(i1)が無効になります。

二asides:

  • あなたは一貫したインデントと賢明な空白文字を使用してString.regionMatches
  • になっているはずですが、あなたのコード読みずっと容易に行うことができます。
1

string.charAt(x)を使用する場合は、文字列の長さを超えていないことを確認する必要があります。 Documentationは、index引数が負であるか、またはこの文字列の長さ以上である場合に "IndexOutOfBoundsException"を受け取ることを示しています。そしてあなたの特定のケースでは、あなたはループの中であなたがw長さであることを検証しているだけなので、失敗します。

すでに述べたように、ループはwの長さだけを考慮して実行されるため、sが短い場合は例外が発生します。短い文字列になるように条件を確認するか、プロセスを再考してください。

+0

はい、毎回チェックを行うことで、問題を解決することができます。問題には包帯を貼るだけです。しかし、これは問題の根本的な原因ではありません。したがって、このソリューションの使用をお勧めしません。また、これは後者のコードで他の問題を引き起こす可能性があります。 –

+0

ええ、すべての繰り返しを意味するわけではありません。私は編集しなければならないと思う – Alfabravo

1

いくつかのヒント:あなたが助けをデバッグするために求めているとき

まず、常にフルスタックトレースが含まれます。問題が発生している正確な行番号を指しているはずです。

第二には、あなたの問題は、あなたがj1これに加えてi1をインクリメントしているあなたの最も内側のループfor(int j1=0;j1<w.length();j1++,i1++)にそうであるi1は結局最後に、あなたがString.contains()メソッドを使用して検討すべき文字列s

の大きさを越えて行くことになります文字列や正規表現でさえも。

関連する問題