Java 代码中如何预防空指针异常

本文总结了项目中遇到的NullPointerException问题,包括引用空对象和基础类型封装类赋值错误等,并提供了具体的解决措施,如使用非空判断工具类等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目中遇到的NullPointerException 分两种情况:

  1. 引用空对象,即调用空对象的方法或引用空对象的属性。

  2. 将8中基础类型的封装类赋值给对应的基础类。

个人在做项目时,对NullPointerException的几点总结。

1.对于别人接口的返回对象要做非空判断,因为我们不清楚获得的对象会不会为空,对于Collection Map 我一般会调用CollectionUtils MapUtils ,对于返回的String对象,我会调StringUtils.isNotEmpty()进行非空判断。他们中isNotEmpty不仅判断了NULL 还判断了空集合和空串。例如从数据中查询的结果。

  1. 对于自己创建的对象,要留心对象进行哪些操作,中间会不会造成对象为空,如果可能加非空判断,尤其是对于集合的操作,很容易就报空指针!!!所以每次对操作集合时,我都会非常的留心。

  2. 对于前台的领域对象要非常的留心,因为这些对象是框架创建的,假如我没有在前台的文本框内输入值,虽然提交时后台获得的是空串,但发生NullPointerException的概率很高。

  3. 对于String 的操作尽量使用apache 的StringUtils类,与String相比这个是非常的安全。对于集合的操作使用apache的CollectionUtils 、MapUtils, 相比apache工具类的执行效率也非常的高,比如StringUtils.split();

有人说过多的判断会影响性能,我个人认为这里的性能牺牲和系统的安全相比是微不足道的。

### Java中使用MapStruct时出现空指针异常的解决方案 #### 1. 配置问题导致的空指针异常 在使用MapStruct时,如果项目构建过程中出现`java: Internal error in the mapping processor: java.lang.NullPointerException`,通常是由于编译器设置或依赖版本不匹配引起的。解决方法包括以下几点: - 在IDEA中调整编译器设置,添加参数`-Djps.track.ap.dependencies=false`[^1]。此参数可以避免注解处理器在某些特定场景下的错误行为。 - 确保`mapstruct`及其相关依赖的版本一致。例如,可以使用以下依赖配置: ```xml <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct</artifactId> <version>1.4.2.Final</version> </dependency> <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-jdk8</artifactId> <version>1.4.2.Final</version> </dependency> <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>1.4.2.Final</version> </dependency> ``` 上述依赖版本应保持一致,否则可能导致编译器内部错误[^5]。 #### 2. Manifest文件加载失败 空指针异常也可能源于`DefaultVersionInformation.createManifestUrl`方法未能正确加载Manifest文件。具体原因可能是`manifest.url.base`未配置或路径无效。为解决此问题,需验证以下内容: - 检查`application.properties`或环境变量中是否正确设置了`manifest.url.base`[^3]。 - 如果使用的是Maven或Gradle构建工具,确保资源文件被正确打包到最终的JAR或WAR文件中。 #### 3. 注解处理器初始化问题 MapStruct的注解处理器在初始化时可能会因某些依赖缺失而抛出空指针异常。以下是可能的解决方案: - 确保项目中没有重复定义的Mapper接口,避免冲突。 - 使用最新版本的IDEA(如2021.x及以上),以支持更稳定的注解处理器功能[^1]。 - 在Mapper接口上添加`@Mapper(componentModel = "spring")`注解,确保生成的实现类能够被Spring容器管理[^2]。 #### 4. 防御性编程与日志优化 为了更好地定位和解决问题,可以在代码中增加防御性检查逻辑。例如: ```java public class DefaultVersionInformation { public static String createManifestUrl(String baseUrl) { if (baseUrl == null || baseUrl.isEmpty()) { throw new IllegalArgumentException("Base URL不能为空"); } return baseUrl + "/manifest.json"; } } ``` 此外,建议在日志中记录详细的上下文信息,便于排查问题。 #### 5. 性能与映射框架对比 从性能角度来看,MapStruct优于其他映射框架(如Dozer、Orika等),因为它通过普通方法调用而非反射来执行映射操作[^4]。因此,在选择映射框架时,优先考虑MapStruct以减少运行时开销。 ### 示例代码 以下是一个简单的MapStruct使用示例: ```java @Mapper public interface UserMapper { UserDto userToUserDto(User user); } ``` 确保Mapper接口被正确扫描并生成实现类。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值