如何修复“ StringIndexOutOfBoundsException”错误?

时间:2019-04-10 06:45:26

标签: java runtime-error

我需要制作一个程序,以打印两个字符串中最长的公共子字符串。 例如:

fetch('https://api.myjson.com/bins/1geede')
.then(response => response.json())
.then(function(data) {
    //Declaring the scope variable for user data
    const scope = data.data.messages;

    console.log("Duplication is here: ", scope);
    console.log("---------");

    //Looping through the user data
    scope.forEach((i) => {
        let user = i;

        console.log(user);
    });
});

最长的公共字符串应为Information: (LongPolling transport) Poll terminated by server Information: Connection disconnected. 。 我只能使用循环,字符串和数组!没有方法/函数等。我是一个初学者,尽管我知道函数,但我不允许使用它。

我尝试使用一个count变量,以使最后一个字母不会一遍又一遍地与第二个字符串中的其他字符进行比较,但是会发生相同的错误。

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

就像我说的那样,结果应该是"abc"就这样了,但是我遇到了运行时错误,说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); 超出了范围6。

谢谢!

6 个答案:

答案 0 :(得分:1)

由于循环到a<str1.length()b<str2.length(),所以您有例外。您应该将其更改为a<str1.length()-1。 发生这种情况是因为您的字符串的长度= 6,但是您从0开始。因此第6个元素将是5。 另外,在while{}中,当ab到达str1str2的最后一个索引时,您将无休止地循环,所以要小心。

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");
    }
}

答案 1 :(得分:0)

之所以会出现异常,是因为您在递增str1.charAt(a)之后访问a,而没有检查它是否仍在边界内。与str2.charAt(b)相同。

将while循环防护更改为:

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

答案 2 :(得分:0)

您的代码有两个错误:

  1. 如果while循环变量小于关联的字符串长度,则可以增加它们。对于长度为6的str1,如果a等于5,这是str1的最后一个索引,则将具有StringIndexOutOfBoundsException(与b / { {1}})

  2. 您无需在str2循环结束时重新初始化com2

您的代码应为:

while

答案 3 :(得分:0)

    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);
      }

   }

进行了一些更改,并在代码中对此进行了注释。似乎工作正常

答案 4 :(得分:0)

你看起来像这样。

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);

答案 5 :(得分:0)

如上所述,存在一些编译错误(尝试使用IDE会有所帮助)。 清理完这些之后,我做了一些更改,它应该可以工作:

{this.state.totalPrice}