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
相关产品推荐
相关产品推荐

