拆分字符串到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
相关产品推荐
相关产品推荐

