You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中substring方法触发StringIndexOutOfBoundsException,求解决方案

解决StringIndexOutOfBoundsException: String index out of range: -1的问题

看起来你是想拆分字符串成不同部分,但代码里的几个小问题导致了索引越界错误。让我们一步步梳理清楚:

问题根源

你的报错出在第18行的substring(second+1),结合代码来看,核心问题有两个可能:

  1. 错误使用空字符串作为查找参数:indexOf("")和lastIndexOf("")的行为和你预期的完全不一样——空字符串在任何字符串的每个位置都"存在",所以indexOf("")会返回0,lastIndexOf("")返回字符串的长度。这会导致second+1超出字符串的合法索引范围,触发越界。
  2. 目标分隔符不存在:如果你的实际需求是用空格(或其他字符)拆分字符串,但输入的字符串里没有这个分隔符,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:34:36