Java报错StringIndexOutOfBoundsException:-1,substring参数合规仍报错求解
为啥你的字符串交换方法会抛出-1索引越界异常?
嘿,我来帮你捋清楚这个问题!首先得先搞懂Java里String.substring()的规则——这个方法的两个参数是起始索引(包含)和结束索引(不包含),而且必须满足0 ≤ 起始索引 ≤ 结束索引 ≤ 字符串长度,不然就会触发异常。
你说传入的是"code"(长度4),但还是触发了StringIndexOutOfBoundsException: -1,最大的可能性是你把substring的两个参数写反了!
比如如果你不小心写成了:
str.substring(str.length()-1, 1)
对"code"来说,str.length()-1是3,这时候起始索引是3,结束索引是1,明显起始比结束大。Java这时候会计算要截取的长度为1-3=-1,直接就抛出你看到的那个异常了。
而正确的写法应该是你原本想的:
str.substring(1, str.length()-1)
对"code"来说,这个调用会截取索引1到3(不包含3)的子串,也就是"od",完全在合法范围内,不会出问题。
另外还要提醒你,得处理边界情况:如果传入的字符串是空串或者只有一个字符(比如""或者"a"),str.length()-1会变成0或者-1,这时候调用substring(1, str.length()-1)也会触发同样的异常。所以你的方法最好加个前置判断:
public static String swapFirstLast(String str) { // 空串或单字符直接返回,不用交换 if (str == null || str.length() <= 1) { return str; } char firstChar = str.charAt(0); char lastChar = str.charAt(str.length() - 1); // 拼接首尾交换后的字符串 return lastChar + str.substring(1, str.length() - 1) + firstChar; }
这样不管传入啥合法字符串,都不会再出索引越界的问题啦。
内容的提问来源于stack exchange,提问作者newbieProgrammer
相关产品推荐
相关产品推荐

