Java charAt()字符串索引超出范围:5

时间:2015-07-13 04:12:16

标签: java string indexing charat

我想弄清楚"当乘以4时,5位数字会给你反转?"使用此代码,但我收到错误:线程中的异常" main" java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:5         at 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;
  }
}

任何帮助都会非常感激

3 个答案:

答案 0 :(得分:4)

正确。因为前五个字符位于索引0, 1, 2, 34。我会使用StringBuilder(因为StringBuilder.reverse())。而且,我建议你限制变量可见性。然后记得在更改number和/或backwards时修改nb。像

这样的东西
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

答案 1 :(得分:0)

backwardsnumberString,内部使用数组。并且数组从0到大小为1。因此,这样的语句将抛出ArrayIndexOutOfBoundsException:

backwards.charAt(5 )
number.charAt(5) 

答案 2 :(得分:0)

在创建字符串时,两个整数都为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。