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

使用Lambda表达式两次分割字符串遇数组越界异常,如何修复?

修复Lambda表达式中的ArrayIndexOutOfBoundsException问题

兄弟,你这段代码的逻辑明显写拧了,咱们一步步捋清楚问题出在哪,再给你修复方案。

首先看你原来的代码:

List<String> stream = Arrays.stream(license.split(System.lineSeparator().split("=")[1])).collect(Collectors.toList());

这里的核心错误是你把换行符的split结果当成了分割整个字符串的参数——System.lineSeparator()是换行符(比如\n或者\r\n),用它去split("="),结果肯定是只有一个元素的数组(因为换行符里根本没有=),这时候你取[1]自然就抛出ArrayIndexOutOfBoundsException了,而且这完全偏离了你原本的需求:先按换行分割每一行,再对每行按=取value。

正确的实现方案

咱们把逻辑拆解开:

  1. 先把整个license字符串按换行符分割,得到每一行的数组
  2. 过滤掉那些不包含=的行(避免处理无效行时再次抛出越界异常)
  3. 对每一行按=分割,取出对应的value部分
  4. 收集成List

代码如下:

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

// 假设license是你的输入字符串
List<String> values = Arrays.stream(license.split(System.lineSeparator()))
    .filter(line -> line.contains("=")) // 先过滤掉没有=的无效行
    .map(line -> line.split("=")[1]) // 分割后取value部分
    .collect(Collectors.toList());

额外优化:处理value中包含=的情况

如果你的value部分可能包含=(比如key=value=with=equals),上面的split("=")[1]只会取第一个=后面的内容(也就是value),这时候可以用split("=", 2)来限制分割次数,确保只分割成两部分,保留value中的所有内容:

List<String> values = Arrays.stream(license.split(System.lineSeparator()))
    .filter(line -> line.contains("="))
    .map(line -> line.split("=", 2)[1]) // 只分割一次,保留value中的=
    .collect(Collectors.toList());

这样修改后,既能避免数组越界异常,又能准确提取你需要的value部分啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:38:03