【问题标题】:java.lang.StringIndexOutOfBoundsException: String index out of rangejava.lang.StringIndexOutOfBoundsException:字符串索引超出范围
【发布时间】:2012-03-02 11:30:41
【问题描述】:

您好,我编写了一个 java 代码来查找由其他单词组成的最长单词。我的逻辑是从文本文件中读取单词列表并将每个单词添加到一个数组中(在文本中,单词被排序,每行只有一个单词)之后我们检查数组中的每个元素是否有其他元素作为子字符串。如果是这样,我们计算子字符串的数量。具有最大子字符串数的元素将是结果

当我给出一个只有两个单词的文本文件时,代码正在运行。但是当有两个以上的单词时,我会收到以下错误

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

我觉得这行 if(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);

}
    }

【问题讨论】:

    标签: java eclipse string substring


    【解决方案1】:

    这就是问题所在:

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

    在循环的每次迭代中,您都在递增 i1j1i1 可能已经在 s 的末尾,所以在你增加它之后,s.charAt(i1) 将是无效的。

    两旁:

    • 你应该看看String.regionMatches
    • 使用一致的缩进和合理的空格可以使您的代码更加更易于阅读。

    【讨论】:

      【解决方案2】:

      一些提示:

      首先,当您寻求调试帮助时,请始终包含完整的堆栈跟踪。它应该指向发生问题的确切行号。

      其次,您的问题可能在您最内部的循环for(int j1=0;j1&lt;w.length();j1++,i1++) 中,除了j1 之外,您还在增加i1 这将导致i1 最终超出字符串s 的大小

      最后,您应该考虑对字符串甚至正则表达式使用String.contains() 方法。

      【讨论】:

        【解决方案3】:

        当您使用 string.charAt(x) 时,您必须检查它是否超出字符串长度。 Documentation 表明如果索引参数为负数或不小于此字符串的长度,您将获得“IndexOutOfBoundsException”。在您的特定情况下,您只是在循环中验证您的长度小于 w,因此它会失败。

        正如 SO 已经说过的,循环运行时只考虑 w 长度,所以如果你有一个较短的 s,它会引发该异常。检查条件,使其上升到较短的字符串或重新考虑过程。

        【讨论】:

        • 是的,每次都检查 charAt 将解决问题,只需在问题上贴上绷带。但这不是问题的根本原因。因此,我不建议使用该解决方案。这也可能导致后面的代码出现其他问题。
        猜你喜欢
        • 1970-01-01
        • 2016-02-25
        • 2018-11-14
        • 1970-01-01
        • 1970-01-01
        • 2014-04-14
        • 1970-01-01
        • 2019-05-22
        • 1970-01-01
        相关资源
        最近更新 更多