Java中substring方法触发StringIndexOutOfBoundsException,求解决方案
解决StringIndexOutOfBoundsException: String index out of range: -1的问题
看起来你是想拆分字符串成不同部分,但代码里的几个小问题导致了索引越界错误。让我们一步步梳理清楚:
问题根源
你的报错出在第18行的substring(second+1),结合代码来看,核心问题有两个可能:
- 错误使用空字符串作为查找参数:
indexOf("")和lastIndexOf("")的行为和你预期的完全不一样——空字符串在任何字符串的每个位置都"存在",所以indexOf("")会返回0,lastIndexOf("")返回字符串的长度。这会导致second+1超出字符串的合法索引范围,触发越界。 - 目标分隔符不存在:如果你的实际需求是用空格(或其他字符)拆分字符串,但输入的字符串里没有这个分隔符,
indexOf和lastIndexOf会返回-1。后续用-1去计算substring的参数,就会出现-1这样的非法索引。
修复方案
假设你是想把类似"John Michael Smith"这样的姓名拆分成名字、中间名、姓氏三部分,我给你调整了代码,加入了输入校验,彻底避免越界问题:
import java.util.Scanner; public class StringExample { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String s = sc.nextLine(); // 先处理空输入或全空格的无效情况 if (s == null || s.trim().isEmpty()) { System.out.println("输入不能为空,请输入有效的内容"); sc.close(); return; } // 用空格作为分隔符,找到第一个和最后一个空格的位置 int firstSpace = s.indexOf(" "); int lastSpace = s.lastIndexOf(" "); // 检查是否有足够的空格来拆分出三部分 if (firstSpace == -1 || lastSpace == -1 || firstSpace == lastSpace) { System.out.println("输入格式不对哦,请输入包含至少两个空格的内容(比如:名字 中间名 姓氏)"); sc.close(); return; } // 安全拆分字符串 String sur = s.substring(lastSpace + 1); String middle = s.substring(firstSpace + 1, lastSpace); String firstname = s.substring(0, firstSpace); System.out.println(sur + " " + firstname + " " + middle); sc.close(); } }
关键改进点
- 替换查找参数:把空字符串
""改成你实际需要的分隔符(这里用了空格" ",如果是逗号、点号等其他分隔符,直接替换即可)。 - 输入校验:提前检查输入是否有效,以及是否找到足够的分隔符,从源头避免异常触发。
- 资源管理:最后关闭了
Scanner,养成良好的资源使用习惯。
如果你的需求不是拆分姓名,而是其他场景,只需要调整分隔符和校验逻辑就可以适配啦。
内容的提问来源于stack exchange,提问作者Shalini Bose
相关产品推荐
相关产品推荐

