2012-02-09 4 views
3

Привет Я написал код Java, чтобы найти самое длинное слово из других слов. Моя логика состоит в том, чтобы прочитать список слов из текстового файла и добавить каждое слово в массив (в тексте слова сортируются, и в каждой строке будет только одно слово). После этого мы проверяем, есть ли у каждого элемента массива другие элементы в качестве подстрок. Если это так, мы подсчитываем количество подстрок. Элементом с максимальным количеством подстрок будет результатjava.lang.StringIndexOutOfBoundsException: String index out of range

Код работает, когда я даю текстовый файл с двумя словами. Но когда есть больше, чем два слова, я получаю следующее сообщение об ошибке

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 в а также j1. i1 уже может быть в конце s, поэтому после того, как вы его увеличили, s.charAt(i1) будет недействительным.

Два отступлений:

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

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

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

+0

Да, делая проверку каждый раз, чтобы charAt исправит проблему, только повязку по этой проблеме. Однако это не основная причина проблемы. Поэтому я бы не рекомендовал использовать это решение. Также это может привести к другим проблемам в последнем коде. –

+0

Хмм, не означает, что каждая итерация. Думаю, я должен отредактировать – Alfabravo

1

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

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

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

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

Смежные вопросы