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

嗨,我写了一个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 

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

两个旁边:

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

一些提示:

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

第二,你的问题可能在你的最内部循环for(int j1=0;j1除了j1之外你正在递增i1这将导致i1最终超出String的大小s

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

使用string.charAt(x)时,必须检查它是否超出字符串长度。 文档显示,如果index参数为负数或不小于此字符串的长度,您将获得“IndexOutOfBoundsException”。 在您的特定情况下,您只是在循环中validation您在w长度下,因此它将失败。

正如SO已经说过的那样,循环运行只考虑了w长度,因此如果你有一个较短的s,它将引发该exception。 检查条件,使其上升到较短的字符串或重新考虑该过程。