Java字符串串联错误“字符串索引超出范围:-1”

时间:2019-10-03 07:15:20

标签: java string

首先,我知道关于“字符串索引超出范围”有很多问题,我已经仔细检查了一下,但是找不到与我有相同问题的人。

我必须编写一个简单的程序:

给出一个字符串,返回“向左旋转n”版本,其中前n个字符移至末尾。

leftN("Hello",2) → "lloHe"
leftN("java",0) → "java"
leftN("Hi,1") → "iH"

所以我写了以下内容:

package string;

public class LeftN {
    public static String leftN(String str, int n) {
        if (str.length() > 1 && n > 0) {
            String a = str.substring(n);
            String b = str.substring(0, n);
            return a + b;
        } else {
            return str;
        }
    }
}

问题: 当我只返回a或仅返回b时,我得到一个有效的输出(如果我在纸上加上ab的输出,我得到的是rotated left n字符串的版本)。但是,当我返回a + b的串联时,出现String index out of range: -1错误,这是什么原因引起的?

现在,我知道此错误与引用超出字符串范围的值有关,并了解在创建子字符串时这是如何工作的。真正令我困惑的是,如何添加两个看似有效的字符串会给我这个错误?

注意:我有一个测试类,前提是要对其进行测试以查看其输出是否正确,但是我不确定是否可以在线发布它,所以这就是为什么没有提供。

1 个答案:

答案 0 :(得分:2)

我可以通过传递大于n长度的str来重现您的异常:

leftN("abc", 4);

results in

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -1
    at java.base/java.lang.String.substring(String.java:1850)
    at Ideone.leftN(Main.java:12)
    at Ideone.main(Main.java:22)

您需要处理n过大(或者实际上是负数)的情况。例如:

  • 扔一个IllegalArgumentException
  • 改为使用n % str.length()