自己建的Util类调用Service报空指针异常

背景:做Excel导出,在自己写的ExcelUtil里进行数据过滤,需要调用Service层接口查询数据,一直报空指针异常,试了很多方法,都不行,最后终于百度到了,做个记录。

 

原因:Service注入失败

一、保证工具类当前所在的包在springmvc配置的扫描路径下

 

二、

  1. 在工具类上加上@Component注解
  2. 使用@PostConstruct注解静态化当前工具类
  3. 调用Service时,使用静态化类调用
<< 在服务层编写逻辑代码时,为了避免因变量为`null`而引发的空指针异常(NullPointerException),可以通过以下几种方式进行处理: ### 方法一:使用 `if` 判断检查是否为空 这是最直接的方法,在操作可能为 null 的对象之前先进行非空判断。 ```java public void processServiceLogic(String variable) { if (variable != null) { // 执行与 variable 相关的操作 System.out.println("Variable is not null, value = " + variable); } // 继续执行其他逻辑,即使 variable 是 null 也不会抛出 NullPointerException System.out.println("Continuing with the rest of the logic..."); } ``` **解释**: 在此示例中,我们通过 `if (variable != null)` 检查了变量是否不为 `null` ,只有当其不为 `null` 时才对其调用方法或访问属性。无论条件结果如何,后续代码都可以正常运行而不中断程序流。 --- ### 方法二:使用 Optional (推荐) 从 Java 8 开始引入了 `Optional<T>` 型作为更优雅的方式来避免显式的 null 检查。它可以明确地表达某个值可能存在也可能不存在,并提供了一些便捷的方法来进行安全的操作。 ```java import java.util.Optional; public void processWithOptional(String variable) { Optional<String> optionalVar = Optional.ofNullable(variable); optionalVar.ifPresent(value -> { // 只有当变量存在且不为 null 时才会进入该块并打印消息。 System.out.println("Value present and processed: " + value.toUpperCase()); }); // 即使没有匹配到任何内容,下面这段也会被执行 System.out.println("Proceeding regardless of whether 'value' was null or not."); } // 测试上述方法: processWithOptional(null); // 输出仅包含后一句 processWithOptional("test"); // 将输出两行信息包括转换后的字符串 ``` **解释**: 使用 `Optional` 不但简化了对潜在 Null 值的手动检测过程而且增强了可读性和安全性。这里借助 lambda 表达式实现了对于非空值得特定行为定义同时保持整体控制结构清晰简单。 --- ### 方法三:捕获异常机制 - try-catch 块 虽然这不是最优的选择,但在某些特殊情况下确实可以用这种方式来防止整个应用程序崩溃。 ```java public void riskyOperation(Object possiblyNullObj) throws Exception{ try { int lengthOfField = ((String)possiblyNullObj).length(); System.out.println(lengthOfField); } catch(NullPointerException e){ // 此处可以选择记录日志或者采取补救措施而不是终止系统运作 System.err.println("'possiblyNullObj' seems to be null"); } // 这里的语句无论如何都会得到执行 System.out.println("Execution moving forward without interruption due to NPE handling."); } ``` **解释**: 当尝试访问可能是空引用的对象上的成员时出现错误,则触发异常处理器内定义的动作序列;然后跳过所有依赖于那个有问题实体的部分转而去完成其余任务。 --- ### 总结 最好的实践通常是结合实际场景选择合适的方式: - 对单个字段做简单的判空可用第一种; - 如果项目中广泛涉及这需求议采用第二种即利用Optionals提升代码质量减少重复冗长的null check; - 最后一种只应在少数无法预见风险的情况下谨慎考虑应用以免掩盖真正的问题根源所在
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值