首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我的程序会抛出一个StringIndexOutOfBounds异常?

为什么我的程序会抛出一个StringIndexOutOfBounds异常?
EN

Stack Overflow用户
提问于 2015-02-28 20:27:27
回答 4查看 1.2K关注 0票数 3

我正在编写一个计算程序:

1^1 + 2^2 + 3^3 +.+ 1000^1000 =?

一旦它计算出来,我想除去答案中除了最后十位数字之外的所有数字,然后在屏幕上打印最后十位数字。然而,要删除我使用StringBuilder.deleteCharAt()方法的所有其他数字,这会给我带来一些问题。我提供了以下代码:

代码语言:javascript
复制
import java.math.BigInteger;
public class problemFourtyEight {
  public static void main(String [] args) {
    BigInteger answer = new BigInteger(""+0);
    for(int i = 0; i <= 1000; i++) {
      BigInteger temp = new BigInteger(""+i);
      temp = temp.pow(i);
      answer = answer.add(temp);
    }
    System.out.println(answer.toString().length());
    StringBuilder sb = new StringBuilder((answer.toString()));
    for(int k = 0; k <= (answer.toString().length() - 10); k++) {
      sb.deleteCharAt(k);  //Line 13 is here.
    }
    String finalAnswer = sb.toString();
    System.out.println(finalAnswer);
  }
}

引发的例外情况是:

代码语言:javascript
复制
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 1501
    at java.lang.AbstractStringBuilder.deleteCharAt(AbstractStringBuilder.java:797)
    at java.lang.StringBuilder.deleteCharAt(StringBuilder.java:253)
    at problemFourtyEight.main(problemFourtyEight.java:13)

从打印出答案的长度(在删除任何字符之前),它告诉我这个数字的长度是3001,所以我不明白为什么String index 1,501被称为OutOfBounds

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-02-28 20:31:58

您的错误是这个代码:

代码语言:javascript
复制
StringBuilder sb = new StringBuilder((answer.toString()));
for(int k = 0; k <= (answer.toString().length() - 10); k++) {
  sb.deleteCharAt(k);  //Line 13 is here.
}

由于字符串生成器的可变性,使字符串变得更短。你想:

代码语言:javascript
复制
System.out.println(answer.substring(answer.length()-10))

这也有速度的优势,如果这对你很重要的话。

票数 6
EN

Stack Overflow用户

发布于 2015-02-28 20:31:16

删除i'th字符时,i+1'th字符将成为新的i'th字符。因此,您的外观应该始终删除第一个字符:

代码语言:javascript
复制
for(int k = 0; k <= (answer.toString().length() - 10); k++) {
  sb.deleteCharAt(0);
}

例如:

代码语言:javascript
复制
        StringBuilder sb = new StringBuilder("abcdef");
        sb.deleteCharAt(0);
        sb.deleteCharAt(1);
        sb.deleteCharAt(2);
        sb.deleteCharAt(3); // throws java.lang.StringIndexOutOfBoundsException: String index out of range: 3
        System.out.println(sb.toString());

        sb = new StringBuilder("abcdef");
        sb.deleteCharAt(0);
        sb.deleteCharAt(0);
        sb.deleteCharAt(0);
        sb.deleteCharAt(0);
        System.out.println(sb.toString()); // prints "ef"
票数 1
EN

Stack Overflow用户

发布于 2015-02-28 20:38:18

如果您检查了您的StringBuilder对象的长度,这段代码可能会工作(有点),但是您可以检查原始字符串的长度,但是从StringBuilder中删除字符。每次删除时,StringBuilder都会变短,因此k索引最终超出了sb的范围。

代码语言:javascript
复制
StringBuilder sb = new StringBuilder((answer.toString()));
for(int k = 0; k <= (sb.length() - 10); k++) { // <-- make sure to test the length of the thing you are mutating
  sb.deleteCharAt(0);  // Delete first character of remaining sb
}

但是,是的,substring()应该是--在这里的首选。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28786495

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档