首先,我知道关于“字符串索引超出范围”有很多问题,我已经仔细检查了一下,但是找不到与我有相同问题的人。
我必须编写一个简单的程序:
给出一个字符串,返回“向左旋转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
时,我得到一个有效的输出(如果我在纸上加上a
和b
的输出,我得到的是rotated left n
字符串的版本)。但是,当我返回a + b
的串联时,出现String index out of range: -1
错误,这是什么原因引起的?
现在,我知道此错误与引用超出字符串范围的值有关,并了解在创建子字符串时这是如何工作的。真正令我困惑的是,如何添加两个看似有效的字符串会给我这个错误?
注意:我有一个测试类,前提是要对其进行测试以查看其输出是否正确,但是我不确定是否可以在线发布它,所以这就是为什么没有提供。
答案 0 :(得分:2)
我可以通过传递大于n
长度的str
来重现您的异常:
leftN("abc", 4);
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()
。