簡體   English   中英

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

[英]java.lang.StringIndexOutOfBoundsException: String index out of range

嗨,我寫了一個java代碼,找到由其他單詞組成的最長單詞。 我的邏輯是從文本文件中讀取單詞列表並將每個單詞添加到一個數組中(在文本中單詞是排序的,每行中只有一個單詞)之后我們檢查數組中的每個元素是否都有其他元素作為子串。 如果是這樣,我們計算子串的數量。 結果將是具有最大子串數的元素

當我給出一個只有兩個單詞的文本文件時代碼正在運行。 但是當有兩個以上的單詞時,我會聽到錯誤

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

}
    }

這就是問題:

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

在循環的每次迭代中,你都在遞增i1j1 i1可能已經在s的末尾,所以在你增加它之后, s.charAt(i1)將無效。

兩個旁邊:

  • 你應該看看String.regionMatches
  • 使用一致的縮進和合理的空格可以使您的代碼容易閱讀。

使用string.charAt(x)時,必須檢查它是否超出字符串長度。 文檔顯示如果index參數為負或不小於此字符串的長度,您將獲得“IndexOutOfBoundsException”。 在你的特定情況下,你只是在循環中驗證你在w長度,所以它將失敗。

正如SO已經說過的那樣,循環只考慮w長度,所以如果你有一個較短的s,它將引發該異常。 檢查條件,使其上升到較短的字符串或重新考慮該過程。

一些提示:

首先,當您要求調試幫助時,始終包括完整的堆棧跟蹤。 它應指向問題正在發生的確切行號。

第二,你的問題可能在你的最內部循環for(int j1=0;j1<w.length();j1++,i1++)除了j1之外你正在遞增i1這將導致i1最終超出String的大小s

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM