2012-02-09 149 views
3

嗨我寫了一個Java代碼來查找由其他字組成的最長的單詞。我的邏輯是從文本文件中讀取單詞列表,並將每個單詞添加到數組中(在文本中,單詞是排序的,每行只會有一個單詞)之後,我們檢查數組中的每個元素是否其他元素作爲子字符串。如果是這樣,我們計算子串的數量。具有最多子字符串的元素將成爲結果java.lang.StringIndexOutOfBoundsException:字符串索引超出範圍

代碼正在運行時,我給一個文本文件只有兩個字。但是,當有兩個以上的字我收到以下錯誤

java.lang.StringIndexOutOfBoundsException:字符串索引超出範圍:3

我覺得錯誤是在這行,如果(s.charAt(I1存在的)== 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一以及j1i1可能已經在s的末尾,所以在你增加它之後,s.charAt(i1)將會失效。

兩個旁白:

  • 你應該看看String.regionMatches
  • 使用一致縮進和明智的空白可以使你的代碼更容易閱讀。
1

當您使用string.charAt(x)時,您必須檢查它是否超出字符串長度。 Documentation表明如果索引參數爲負數或不小於此字符串的長度,您將得到「IndexOutOfBoundsException」。而在你的特殊情況下,你只是在循環中驗證你正在使用的長度,所以它會失敗。

正如SO已經說過的,循環只考慮w的長度,所以如果你有更短的s,它會引發這個異常。檢查條件,以便更短的字符串或重新考慮過程。

+0

是的,每次做charAt檢查都可以解決問題,只會在問題上提出一個繃帶。這不是問題的根本原因。因此,我不會推薦使用該解決方案。這也可能導致代碼後面的其他問題。 – 2012-02-09 23:09:50

+0

嗯,並不意味着每一次迭代。猜猜我必須編輯 – Alfabravo 2012-02-09 23:11:01

1

一些提示:

首先,總是包含完整的堆棧跟蹤,當你所要求的調試幫助。它應該指向問題發生的確切行號。

其次,你的問題很可能在你最內環for(int j1=0;j1<w.length();j1++,i1++)你除了j1遞增i1這將導致i1最終超越串的大小s

最後,你應該考慮使用String.contains()方法對於字符串甚至正則表達式。

相關問題