[英]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++)
這個答案分為三個部分:
這是編譯並返回值的代碼版本。 但是,如果那是您的預期返回值,我不知道。 將您的代碼與它應該完成的實際任務一起(詳細)會很棒。
我改變的是:
<=
) 更改為低於 ( <
),因為字符串的最大索引等於其長度減一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.