Java charAt() 字符串索引超出范围:5
Java charAt() String index out of range: 5
我正在尝试使用此代码找出 "what 5-digit number when multiplied by 4 gives you its reverse?" 但我收到错误:线程 "main" java.lang.StringIndexOutOfBoundsException 中的异常:字符串索引超出范围:5
在 java.lang.String.charAt(String.java:658)
在 Digits.main(Digits.java:12)
public class Digits{
public static void main(String[] args) {
int n = 0;
int b = 0;
String number = Integer.toString(n);
String backwards = Integer.toString(b);
for (int x = 9999; x < 100000 ; x++ ) {
n = x;
b = x *4;
if (number.charAt(0) == backwards.charAt(5 )&& number.charAt(1) == backwards.charAt(4)
&& number.charAt(2) == backwards.charAt(3) && number.charAt(3) == backwards.charAt(2)
&& number.charAt(4) == backwards.charAt(1) && number.charAt(5) == backwards.charAt(0)) {
System.out.println(n);
break;
}
}
如有任何帮助,我们将不胜感激
backwards
和number
是String
,内部使用数组。数组的索引从 0 到 size-1 。因此,此类语句将抛出 ArrayIndexOutOfBoundsException:
backwards.charAt(5 )
number.charAt(5)
在你创建字符串时,你的两个整数都是 0,所以你的两个字符串在你的程序运行期间都是“0”。您真正想要的是每次您的号码更改时更改的字符串。所以你的代码应该看起来更像这样:
public class Digits{
public static void main(String[] args) {
int n = 0;
int b = 0;
String number;
String backwards;
for (int x = 10000; x < 100000 ; x++ ) {
n = x;
b = x *4;
number = Integer.toString(n);
backwards = Integer.toString(b)
. . .
}
此外,Java 中的数组是零索引的,因此例如对于字符串“10000”,您的程序将在 backwards.charAt(5)
上抛出索引越界异常,因为该字符串是从字符 0 到字符 4 索引。
正确。因为前五个字符位于索引 0, 1, 2, 3
和 4
处。我会使用 StringBuilder
(因为 StringBuilder.reverse()
)。而且,我建议您限制变量可见性。然后在改n
and/orb
的时候记得修改number
和backwards
。像
for (int x = 9999; x < 100000; x++) {
int n = x;
int b = x * 4;
String number = Integer.toString(n);
String backwards = Integer.toString(b);
StringBuilder sb = new StringBuilder(number);
sb.reverse();
if (sb.toString().equals(backwards)) {
System.out.printf("%s * 4 = %s", number, backwards);
}
}
然后我得到
21978 * 4 = 87912
我正在尝试使用此代码找出 "what 5-digit number when multiplied by 4 gives you its reverse?" 但我收到错误:线程 "main" java.lang.StringIndexOutOfBoundsException 中的异常:字符串索引超出范围:5 在 java.lang.String.charAt(String.java:658) 在 Digits.main(Digits.java:12)
public class Digits{
public static void main(String[] args) {
int n = 0;
int b = 0;
String number = Integer.toString(n);
String backwards = Integer.toString(b);
for (int x = 9999; x < 100000 ; x++ ) {
n = x;
b = x *4;
if (number.charAt(0) == backwards.charAt(5 )&& number.charAt(1) == backwards.charAt(4)
&& number.charAt(2) == backwards.charAt(3) && number.charAt(3) == backwards.charAt(2)
&& number.charAt(4) == backwards.charAt(1) && number.charAt(5) == backwards.charAt(0)) {
System.out.println(n);
break;
}
}
如有任何帮助,我们将不胜感激
backwards
和number
是String
,内部使用数组。数组的索引从 0 到 size-1 。因此,此类语句将抛出 ArrayIndexOutOfBoundsException:
backwards.charAt(5 )
number.charAt(5)
在你创建字符串时,你的两个整数都是 0,所以你的两个字符串在你的程序运行期间都是“0”。您真正想要的是每次您的号码更改时更改的字符串。所以你的代码应该看起来更像这样:
public class Digits{
public static void main(String[] args) {
int n = 0;
int b = 0;
String number;
String backwards;
for (int x = 10000; x < 100000 ; x++ ) {
n = x;
b = x *4;
number = Integer.toString(n);
backwards = Integer.toString(b)
. . .
}
此外,Java 中的数组是零索引的,因此例如对于字符串“10000”,您的程序将在 backwards.charAt(5)
上抛出索引越界异常,因为该字符串是从字符 0 到字符 4 索引。
正确。因为前五个字符位于索引 0, 1, 2, 3
和 4
处。我会使用 StringBuilder
(因为 StringBuilder.reverse()
)。而且,我建议您限制变量可见性。然后在改n
and/orb
的时候记得修改number
和backwards
。像
for (int x = 9999; x < 100000; x++) {
int n = x;
int b = x * 4;
String number = Integer.toString(n);
String backwards = Integer.toString(b);
StringBuilder sb = new StringBuilder(number);
sb.reverse();
if (sb.toString().equals(backwards)) {
System.out.printf("%s * 4 = %s", number, backwards);
}
}
然后我得到
21978 * 4 = 87912