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

拆分字符串到Person Bean时处理substring索引越界,将dob设为null

嘿,这个场景我之前做用户数据批量解析的时候也碰到过!核心就是要同时解决两个问题:一是避免字符串截取时的StringIndexOutOfBoundsException,二是处理截取后的内容无法转换为Long的情况(比如你例子里带空格的s1),最终实现当dob部分无效时自动设为null的需求。

分步解决方案

1. 直接在赋值逻辑中处理(快速实现)

不需要额外工具类的话,可以直接在赋值时加入判断和异常捕获:

Person p = new Person();

// 处理name:如果字符串长度不足4位,就取整个字符串作为name
p.setName(s.length() >= 4 ? s.substring(0, 4) : s);

// 处理dob:先安全截取,再尝试转换
String dobSegment = null;
// 先判断是否能取到完整的8位dob片段(索引4到12)
if (s.length() >= 12) {
    dobSegment = s.substring(4, 12);
} else if (s.length() > 4) {
    // 如果长度在4-12之间,截取从4开始到末尾的部分
    dobSegment = s.substring(4);
}
// 尝试转换为Long,失败则设为null
try {
    p.setDob(dobSegment != null ? Long.parseLong(dobSegment) : null);
} catch (NumberFormatException e) {
    p.setDob(null);
}

// 处理city:从索引12开始取到末尾,不足12位则设为null
p.setCity(s.length() >= 12 ? s.substring(12) : null);

针对你提到的s1 = "John2107 Bangalore",这段代码会截取到"2107 Bang"作为dob片段,转换Long时抛出NumberFormatException,最终dob被设为null,完全符合你的需求。

2. 封装工具类(复用性更高)

如果需要多次处理这类字符串解析,建议封装两个工具方法,让代码更整洁:

public class StringParseUtils {
    // 安全截取字符串,避免越界
    public static String safeSubstring(String original, int start, int end) {
        if (original == null) {
            return null;
        }
        // 确保start不小于0,end不超过字符串长度
        int actualStart = Math.max(0, start);
        int actualEnd = Math.min(original.length(), end);
        // 如果start >= end,返回null
        return actualStart < actualEnd ? original.substring(actualStart, actualEnd) : null;
    }

    // 安全转换Long,失败返回null
    public static Long safeParseLong(String str) {
        if (str == null || str.trim().isEmpty()) {
            return null;
        }
        try {
            // 先trim避免空格干扰
            return Long.parseLong(str.trim());
        } catch (NumberFormatException e) {
            return null;
        }
    }
}

使用工具类的代码会简洁很多:

Person p = new Person();
p.setName(StringParseUtils.safeSubstring(s, 0, 4));
String dobSegment = StringParseUtils.safeSubstring(s, 4, 12);
p.setDob(StringParseUtils.safeParseLong(dobSegment));
p.setCity(s.length() >= 12 ? s.substring(12) : null);

额外提示

如果你的字符串格式有更灵活的规则(比如name不一定是4位,dob可能是其他长度),可以考虑用正则表达式来匹配,比如:

Pattern pattern = Pattern.compile("([A-Za-z]+)(\\d{0,8})(.*)");
Matcher matcher = pattern.matcher(s);
if (matcher.matches()) {
    p.setName(matcher.group(1));
    p.setDob(StringParseUtils.safeParseLong(matcher.group(2)));
    p.setCity(matcher.group(3));
}

这种方式对格式的兼容性更强,比如name长度不固定的情况也能处理。

内容的提问来源于stack exchange,提问作者Chanti Chanti

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:15:59