簡體   English   中英

For 循環的字符串越界異常

[英]String Out of Bounds Exception for For Loop

代碼可以編譯,但在它的運行器中我得到了一個越界異常。 for循環有問題嗎?

public class CountPairs
{
    public static int pairCounter( String str )
    { 
      //count pairs and aaa counts as 2
      int count = 0;
      int stringLength = str.length();
      String string = str;
      
      for( int i = 1; i <= stringLength; i++ )
      {
         char first = string.charAt( 0 );
         if( first == string.charAt( i ) )
         {
            count++;
         }
         string = string.substring( i );
      }
      return count;
    }
}

您應該替換以下行:

for( int i = 1; i <= stringLength; i++ )

帶線:

for( int i = 0; i < stringLength; i++ )

您應該只從索引i = 0開始循環遍歷您的字符串

首先

String基本上是char[] array的包裝器。

第二

Java 中的array索引從零開始 負索引在 Java 中無效。

第三

Java 將拋出ArrayIndexOutOfBoundException ,如果您嘗試訪問具有無效索引Array ,這可能意味着 Java 中的“負索引”、“索引大於或等於數組的長度”。

您有問題的代碼:

public class CountPairs
{
    public static int pairCounter( String str )
    { 
      //count pairs and aaa counts as 2
        int count = 0;
      int stringLength = str.length();
      String string = str;
      
      for( int i = 1; i <= stringLength; i++ )
      {
         char first = string.charAt( 0 );
         if( first == string.charAt( i ) )
         {
            count++;
         }
         string = string.substring( i );
      }
      return count;
    }
}

一個可能的解決方案:

public class CountPairs
{
    public static int pairCounter( String str )
    { 
      //count pairs and aaa counts as 2
        int count = 0;
      int stringLength = str.length();
      String string = str;
      
      for( int i = 0; i < stringLength; i++ )
      {
         char first = string.charAt( 0 );
         if( first == string.charAt( i ) )
         {
            count++;
         }
         string = string.substring( i );
      }
      return count;
    }
}

希望這可以解決您的問題。

如果是,請豎起大拇指

繼續學習Java!

因為String中第一個字符的索引是 0,所以最后一個字符的索引是myString.length() - 1 ,並且myString.charAt(myString.length())拋出一個StringOutOfBoundsException 要修復您的代碼,請將循環 header 更改為for (int i = 0;i < myString. length();i++)

這個答案分為三個部分:

  1. 修復您的原始代碼以便編譯,但可能無法獲得您想要的返回值(找到所有並排出現的相等字符對?)
  2. 更改您的原始代碼,以便計算所有並排出現的相等字符對
  3. 顯示有關您的原始代碼如何操作的簡短事件序列,以便您可以反映錯誤的地方

修復編譯和運行無錯誤:

這是編譯並返回值的代碼版本。 但是,如果那是您的預期返回值,我不知道。 將您的代碼與它應該完成的實際任務一起(詳細)會很棒。

我改變的是:

  1. 將低等於 ( <= ) 更改為低於 ( < ),因為字符串的最大索引等於其長度減一
  2. 添加stringLength的重新計算,因為string及其長度在每次迭代中都會發生變化,這是string = string.substring( i )的原因
public class CountPairs
{
    public static int pairCounter( String str )
    { 
      //count pairs and aaa counts as 2
      int count = 0;
      int stringLength = str.length();
      String string = str;
      
      // change "<=" to "<" because
      // the index of the last character of a string
      // equals its length MINUS 1
      for( int i = 1; i < stringLength; i++ )
      {
         char first = string.charAt( 0 );
         if( first == string.charAt( i ) )
         {
            count++;
         }
         // Here you reassign "string" to be a substring of itself
         // effectively changing its length and index positions completely
         string = string.substring( i );
         // so you have to recalculate the Length of "string"
         // which changes in each iteration!
         stringLength = string.length();

      }
      return count;
    }
}

更改可能正確的返回值

但除此之外,我認為您真正想要的是大小為 2 的滑動 window 並在此 window 中的字符相等時遞增計數器。 這可以類似地實現,但無需調用substring

public class CountPairs
{
    public static int pairCounter( String str )
    { 
      //count pairs and aaa counts as 2
      int count = 0;
      int stringLength = str.length();
      String string = str;
      
      for( int i = 0; i < stringLength - 1; i++ )
      {
         char first = string.charAt( i );
         if( first == string.charAt( i + 1 ) )
         {
            count++;
         }
      }
      return count;
    }
}

您的代碼在原始版本中的作用的簡短示例:

下面是一些偽語法,顯示了變量及其值如何隨您最初定義的 function 變化。

還有一些幫助顯示索引和所涉及的字符串的位置。 string的相關索引由下面的^標記,並在下面的另一行伴隨着它們的索引位置

stringLength = 6
string = "aabccd"

// ...
// here the first iteration of the loop starts
i = 1
first = "aabccd".charAt( 0 ) = "a"
         ^
         012345

second = "aabccd".charAt(i = 1) = "a"
           ^
          012345

// first equals second so increment counter
first == second => count++
string = "aabccd".substring( i = 1) = "abccd"
           ^^^^^
          012345
-------------
// second for loop iteration, i is incremented to 2, string is "abccd"
i = 2
first = "abccd".charAt( 0 ) = "a"
         ^
         01234

second = "abccd".charAt(i = 2) = "c"
            ^
          01234

first != second
string = "abccd".substring( i = 2) = "ccd"
            ^^^
          01234
-------------
// third for loop iteration, i is incremented to 3, string is "ccd"
i = 3
first = "ccd".charAt( 0 ) = "a"
         ^
         012

// Here already an index out of bounds exception is thrown!!
// because 3 is larger than the highest possible index position 2
second = "ccd" .charAt(i = 3) = "c"
             ^
          012

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM