java.lang.StringIndexOutOfBoundsException: индекс строки вне диапазона - PullRequest
3 голосов
/ 10 февраля 2012

Привет, я написал код 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);

}
    }

Ответы [ 3 ]

6 голосов
/ 10 февраля 2012

Это проблема:

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

На каждой итерации цикла вы увеличиваете i1, а также j1.i1 может уже находиться в конце s, поэтому после его увеличения значение s.charAt(i1) будет недействительным.

С двух сторон:

  • Выследует посмотреть на String.regionMatches
  • Использование последовательного отступа и разумного пробела может сделать ваш код намного более легким для чтения.
1 голос
/ 10 февраля 2012

Несколько советов:

Во-первых, всегда включайте полную трассировку стека, когда вы запрашиваете помощь в отладке.Он должен указывать на точный номер строки, на которой происходит проблема.

Во-вторых, ваша проблема, скорее всего, в вашем самом внутреннем цикле for(int j1=0;j1<w.length();j1++,i1++) вы увеличиваете i1 в дополнение к j1, это приведет к i1, чтобы в конечном итоге выйти за рамки размера String s

Наконец, вам следует рассмотреть возможность использования метода String.contains () для строк или даже регулярного выражения.

1 голос
/ 10 февраля 2012

Когда вы используете string.charAt (x), вы должны убедиться, что он не превышает длину строки. Документация показывает, что вы получите «IndexOutOfBoundsException, если аргумент индекса отрицателен или не меньше длины этой строки». А в вашем конкретном случае вы проверяете только в цикле, что у вас меньше длины w, поэтому он потерпит неудачу.

Как уже говорилось в SO, цикл выполняется только с учетом длины w, поэтому в случае, если у вас меньше s, он вызовет это исключение. Проверьте условие, чтобы оно подходило к более короткой строке или переосмыслило процесс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...