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

Spring项目中URL列表添加失败及空指针问题求助

问题排查与解决

一、原始代码的核心错误

1. 不可扩容的列表导致add()失败

你用Arrays.asList(new String[count])创建的列表是Arrays内部的固定大小列表,不支持add()操作,调用该方法会直接抛出UnsupportedOperationException。而且这个列表初始时全是null,你用增强for循环遍历的是这些null元素,逻辑完全错误。

2. 字段名拼写错误导致循环不执行

MyRequest类里的字段是cound,但你在Service中调用myRequest.getCount(),这会获取到int类型的默认值0,循环条件永远不成立,最终列表为空。

二、补充代码的问题分析

1. 循环不执行的根源

还是MyRequest的字段名错误:把private int cound;改成private int count;,否则myRequest.getCount()始终返回0,循环根本不会启动。

2. 空指针异常的触发点

  • letters未初始化:如果letters是null,调用letters.get()会直接抛出空指针,必须提前初始化这个列表(比如包含字母和数字的集合)。
  • rand未实例化:如果只声明了Random rand;但没写rand = new Random();,调用rand.nextInt()也会触发空指针。

三、修正后的完整代码示例

1. 修正MyRequest类

@Data
public class MyRequest implements Serializable {

    @NotNull(message = "Url cannot be null or empty")
    private String url;
    @NotNull(message = "count cannot be null or empty")
    private int count; // 修正拼写错误
}

2. 修正Service实现类

@Override
public MyResponse urlGenerator(MyRequest myRequest) {

    log.info("urlGenerator started..");

    myUrlRequestValidator.validate(myRequest);

    String longUrl = myRequest.getUrl();
    int count = myRequest.getCount();

    // 使用可扩容的ArrayList
    List<String> uniqueUrlList = new ArrayList<>();
    // 实例化Random对象
    Random rand = new Random();
    // 初始化字母数字集合(按需调整内容)
    List<String> letters = Arrays.asList(
        "a","b","c","d","e","f","g","h","i","j","k","l","m",
        "n","o","p","q","r","s","t","u","v","w","x","y","z",
        "0","1","2","3","4","5","6","7","8","9"
    );

    for (int j = 0; j < count; j++) {
        // 用StringBuilder提升字符串拼接性能
        StringBuilder urlBuilder = new StringBuilder(longUrl + "/?");
        // 生成4-14位的随机后缀
        int suffixLength = rand.nextInt(11) + 4;
        for (int i = 0; i < suffixLength; i++) {
            // 用letters.size()避免索引越界
            urlBuilder.append(letters.get(rand.nextInt(letters.size())));
        }
        String uniqueUrl = urlBuilder.toString();
        uniqueUrlList.add(uniqueUrl);
        log.info(uniqueUrl);
    }

    MyResponse response = new MyResponse();
    response.setLongUniqueUrlList(uniqueUrlList);
    return response;
}

额外优化建议

  • 将rand和letters声明为类成员变量并提前初始化,避免每次调用方法重复创建。
  • 用StringBuilder代替直接字符串拼接,减少内存开销。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 05:10:21