Java 子串函数不能产生期望的结果

Java 子串函数不能产生期望的结果,java,substring,Java,Substring,我目前正在编写以下程序,试图将Double的ArrayList更改为stringone,然后显示stringarray中每个元素的substring3,11 请参见以下内容: ArrayList<Double> nums = new ArrayList<Double>(); ArrayList<String> strs = new ArrayList<String>(); for (double i = 1; i <

我目前正在编写以下程序,试图将Double的ArrayList更改为stringone,然后显示stringarray中每个元素的substring3,11

请参见以下内容:

    ArrayList<Double> nums = new ArrayList<Double>();
    ArrayList<String> strs = new ArrayList<String>();

    for (double i = 1; i < 1000; i++) {
        nums.add(1/i);
}

    for (Double double1 : nums) {

        BigDecimal bd = new BigDecimal(double1);
        strs.add(bd.toString());
    }

    for (String string : strs) {

        System.out.println(string.substring(3,11);
    }
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 11
    at java.lang.String.substring(Unknown Source)
    at AnotherTestClass.main(AnotherTestClass.java:28)
您正在尝试子字符串的字符串没有那么长。更改决定子字符串变量的方式。即

if(string.length > 3)
    string.substring(3, (string.length -1));

问题在第行-System.out.printlnstring.substring3,11

变量字符串的长度在代码中的任何一点都不超过3,如

for (double i = 1; i < 1000; i++) {
  nums.add(1/i);
}

当您在调试器中检查名为string的变量时,它的值是多少?您认为substring3,11的作用是什么?问题是一些字符串的长度不是11+。您在这里试图实现的具体目标是什么,我们可能会帮助您找到更好的解决方案。子字符串正在按预期工作。首先阅读文档以了解其行为。程序员不会无缘无故地编写文档。大家好,谢谢你们的帮助!大卫·科尔的建议帮助我解决了这个问题。我明白是我的代码错了,而不是子字符串函数本身。使用string.length-1作为EndIndex帮助很大。谢谢最后一个索引是独占的,因此要包含绝对的最后一个字符[3,string.length作为边界。您好,谢谢您的帮助。当我运行您建议的代码时,我得到了与以前相同的错误。但是如果我取出System.out.PrintLString.substring3,11并离开System.out.PrintLString,我确实会得到该数组中所有字符串的输出:10.5 0.333333333333314829616256473909939472198486328125 0.25 0.2000000000000000111022302462515654023631668090908203125 0.16666666666666574148081281236954964697360992431640625 0.1428571428571428492126921248881854116916656494140625 0.125 0.11111111111111111110494320541874913030979824066162109375………System.out不是调试器。
for (double i = 1; i < 1000; i++) {
  nums.add(1/i);
}
for (String string : strs) {
    System.out.println(string);
    System.out.println(string.substring(3,11);
}