Как исправить ошибку «StringIndexOutOfBoundsException»? - PullRequest
1 голос
/ 10 апреля 2019

Мне нужно создать программу, которая печатает самую длинную общую подстроку из двух строк.например:

String str1 = "abcdef";
String str2 = "abcgef";

самая длинная общая строка должна быть "abc".Я могу только использовать циклы, строки и массивы!нет методов / функций и т. д. Я новичок, и хотя я знаю функции, мне не разрешено его использовать.

Я попытался использовать переменную count, чтобы последняя буква не сравнивалась с другими символами извторая строка снова и снова, но возникает одна и та же ошибка.

String com = "";
String com2 = "";
int a;
int b;

for (i = 0; i < str1.length(); i++) {

    int count1 = 0;
    int count2 = 0;

    for (int j = 0; j < str2.length(); j++) {        
        a = i;
        b = j;
        com2 = "";

        while (str1.charAt(a) == str2.charAt(b)) {
            com2 = com2 + str1.charAt(a);                  

            if (com2.length()>com.length()) {              
                com = com2; 
            }     

            if (a<str1.length()-1) {       
                a++;  
            }

            if (b<str2.length()-1) {       
                b++;
            }                                   
        } 
    } 
} 

System.out.println(com);

Как я уже сказал, результат должен быть "abc", и все, но я получаю ошибку времени выполнения, сообщающую StringIndexOutOfBoundsException вне диапазона 6.

спасибо!

Ответы [ 6 ]

1 голос
/ 10 апреля 2019

У вас есть исключение из-за цикла до a<str1.length() и b<str2.length().Вы должны изменить его на a<str1.length()-1.Это происходит потому, что ваша строка имеет длину = 6, но вы начинаете с 0. Таким образом, шестой элемент будет равен 5. Кроме того, в while{} имеется бесконечный цикл, когда a и b достигают последнего индекса str1 иstr2, так что будьте осторожны.

PS

Вы можете изменить его на

public void method() {
    StringBuilder com = new StringBuilder();
    String str1 = "abcdef";
    String str2 = "abcgef";

    if (str1.length() == str2.length()) {
        for (int i = 0; i < str1.length() - 1; i++) {
            if (str1.charAt(i) == str2.charAt(i)) {
                com.append(str2.charAt(i));
                continue;
            } else {
                break;
            }
        }
        System.out.println(com);
    } else {
        System.out.println("They have different length");
    }
}
0 голосов
/ 10 апреля 2019

как уже упоминалось выше, есть некоторые ошибки компиляции (попробуйте использовать IDE, это помогает).После очистки я внес некоторые изменения, и это должно работать:

    String str1 = "abcdef";
    String str2 = "abcgef";
    String com = "";
    String com2 = "";
    int a;
    int b;

    for (int i = 0; i < str1.length(); i++) {
    //counts removed (never used)
        for (int j = 0; j < str2.length(); j++) {
            a = i;
            b = j;
            com2 = ""; // Reset before start a new Check Loop
            while (str1.charAt(a) == str2.charAt(b)) {
                com2 = com2 + str1.charAt(a);
                if (com2.length() > com.length()) {
                    com = com2;
                }
                /**
                * length() goes from 0 (empty String) to n
                * index 0 is the first char in that String
                * so you need to adjust that (the simple way is -1)
                */
                if(a < str1.length()-1) {
                    a++;
                }
                if(b < str2.length()-1) {
                    b++;
                }
                //check for end of String -> Exit loop
                if(a >= str1.length()-1 && b >= str2.length()-1) {
                    break;
                }
            }
        }
    }
    System.out.println(com);
}
0 голосов
/ 10 апреля 2019

ты выглядишь примерно так.

String str1="abcdef";
    String str2="abcgefghj";
    String com = "";

    int min =Math.min(str1.length(), str2.length());

        for (int i =0; i< min ; i++) 
        {

              if(str1.charAt(i) == str2.charAt(i))
               {

                   com = com + str1.charAt(i);                     

               }
              else {
                  break;
              }

        }

        System.out.println(com);
0 голосов
/ 10 апреля 2019
    public class Main
    {
      public static void main (String[]args)
      {
        String com = "";
        String com2 = "";
        String str1 = "bowbowbowbow";  // took the liberty of initializiating
        String str2 = "heloobowbowhellooo";
        int a;
        int b;

        for (int i = 0; i < str1.length (); i++)
          {
              // removed redundant declaration and initializiation of count 1 and count 2

        for (int j = 0; j < str2.length (); j++)
          {

            a = i;
            b = j;

            com2 = ""; // com2 should be made empty for each iteration

            while ( ( str1.charAt (a) == str2.charAt (b) ) && (a < str1.length() - 1 ) && ( b < str2.length() -1)  )
              {

            com2 = com2 + str1.charAt (a);
            if (com2.length () > com.length ())
              {
                com = com2;
              }

                a++;
                b++;

              }
          }
          }
        System.out.println (com);
      }

   }

Внес некоторые изменения и прокомментировал это в коде.Кажется, работает нормально

0 голосов
/ 10 апреля 2019

Две ошибки в вашем коде:

  1. Вы увеличиваете переменные цикла while, если они меньше, чем соответствующая длина строки. Для str1 с длиной 6, если a равно 5, что является последним индексом str1, у вас будет StringIndexOutOfBoundsException (то же самое для b / str2)

  2. Вы не можете повторно инициализировать com2 в конце цикла while

Ваш код должен быть:

String com = "";
String com2 = "";
int a;
int b;

for (i=0; i<str1.length(); i++) {

    int count1 = 0;
    int count2 = 0;

    for (int j=0; j<str2.length(); j++) {        

        a = i;
        b = j;

        while (str1.charAt(a) == str2.charAt(b)) { 
            com2 = com2 + str1.charAt(a);                  
            if (com2.length()>com.length()) {              
                com = com2; 
            }      
            if (a<str1.length() - 1) {
                a++;  
            }
            if (b<str2.length() - 1) {
                b++;  
            }                                   
        } 
        com2 = "";
     } 
} 
System.out.println(com);
0 голосов
/ 10 апреля 2019

Вы получаете исключение, потому что вы получаете доступ к str1.charAt(a) после увеличения a, не проверяя, находится ли он все еще в границах.То же самое для str2.charAt(b).

Измените защиту цикла while на:

while (a < str1.length() && b < str2.length() && str1.charAt(a) == str2.charAt(b))
...