Spring Boot测试出现Cannot invoke String.hashCode() because <local4> is null错误排查
Spring Boot MockMvc测试空指针错误排查方案(Cannot invoke "String.hashCode()")
一、定位对应的源码变量
- 查看测试输出的完整异常堆栈,找到空指针发生的类、方法和行号,直接定位到调用
hashCode()的String变量。 - 如果日志未打印完整堆栈,可修改MockMvc测试代码强制输出详细日志:
mockMvc.perform(get("/ricerca/anagrafica")) .andDo(MockMvcResultHandlers.print()) .andExpect(status().isOk());
二、检查请求入参的绑定情况
空指针大概率是接口入参未正确传递导致:
- 核对控制器方法的入参定义,确认是否有必填的String类型参数(如
@RequestParam、@PathVariable、@RequestBody字段)在测试中被遗漏或传为null。 - 示例错误场景:控制器要求
codice参数,但测试未传递,导致后续逻辑中调用该参数的hashCode()时触发空指针:// 错误测试代码:未传递必填参数 mockMvc.perform(get("/ricerca/anagrafica")); // 修正后:传递合法的非空参数 mockMvc.perform(get("/ricerca/anagrafica").param("codice", "TEST001"));
三、排查业务逻辑中的空值调用
跟踪控制器关联的服务、DAO层代码,找到所有调用String类型hashCode()的场景:
- 检查是否将可能为null的String变量作为HashMap/HashSet的键,这类集合的
put/get操作会自动调用元素的hashCode()。 - 检查自定义的
equals()/hashCode()方法,是否引用了未做空值校验的String字段。 - 检查缓存、序列化等组件,是否会对传入的String参数自动执行哈希操作。
四、添加空值防护
针对定位到的问题点,添加空值校验避免空指针:
- 在调用
hashCode()前显式判断:String targetStr = // 可能为null的变量 if (targetStr == null) { throw new IllegalArgumentException("参数不能为空"); // 或使用默认值:targetStr = ""; } int hash = targetStr.hashCode(); - 对接口入参使用Spring Validation注解提前拦截空值:
@GetMapping("/ricerca/anagrafica") public ResponseEntity<?> search(@RequestParam @NotBlank(message = "codice不能为空") String codice) { // 业务逻辑 }
内容的提问来源于stack exchange,提问作者Lore
相关产品推荐
相关产品推荐

