【Sonar技术债务解】Null pointers should not be dereferenced

本文关注SonarLint中的一项警告,即禁止解除可能为null的指针引用,以防止抛出NullPointerException。建议使用Objects.requireNonNull()进行非空检查,确保代码的健壮性。

SonarLint
Null pointers should not be dereferenced
A “NullPointerException” could be thrown: "getReauestAttributes0y can return null.r
在这里插入图片描述
问题释义: 空指针不应取消引用
修改方法: 增加非空处理 Objects.requireNonNull(xxx)
在这里插入图片描述

<think>好的,我需要决用户提到的两个问题:一是SonarLint提示的“静态基类成员不应通过派生类型访问”,二是如何将JSON中的code和msg赋值给BusinessException的属性。 首先,关于Sonar的问题。根据引用[2]和[5],当子类继承父类的静态方法或成员时,直接通过子类调用这些静态成员会导致代码不清晰,可能让人误以为子类有自己的静态成员。比如用户提到的StrUtil.format,假设StrUtil是某个父类的子类,那么应该直接通过父类来调用format方法,而不是子类StrUtil。需要检查StrUtil的继承结构,确认format方法是否来自父类,如果是,应该改用父类名称调用,例如StringUtils.format,这样就符合Sonar的要求了。 接下来是JSON析的问题。用户想将JSON中的code和msg字段赋值给BusinessException对象的code和message属性。通常的做法是使用JSON库的反序列化功能。例如,使用FastJSON的JSON.parseObject方法,将JSON字符串转换为BusinessException对象。需要确保BusinessException类有对应的setter方法或公开的字段,以便JSON库能够正确映射字段。比如,JSON字符串类似{"code":1001,"msg":"error"},调用JSON.parseObject(jsonStr, BusinessException.class)即可自动填充属性。如果字段名不匹配,可能需要使用注来指定映射关系,比如@JSONField(name = "code")。 还需要注意引用[4]提到的空指针问题,确保在析时处理可能的null值。比如使用StrUtil.isBlank()来检查字符串,避免调用isEmpty()导致异常。此外,如果用户使用的是自定义的JSON工具类,可能需要调整代码,确保通过正确的父类调用静态方法,如引用[5]中的例子,将JSONObject.parseObject改为JSON.parseObject。 总结步骤:首先修改所有通过子类调用父类静态方法的地方,使用父类名称;其次在析JSON时,使用合适的JSON库方法,并确保异常类的字段正确映射。同时,注意代码中的空值检查,避免潜在问题。</think>### 问题1:如何SonarLint提示的“静态基类成员不应通过派生类型访问”? **决步骤:** 1. **确认静态方法来源** 检查代码中`StrUtil.format`的继承关系。若`StrUtil`是子类且`format`方法实际继承自父类(例如`StringUtils`),则需通过父类调用。 2. **修改调用方式** 将`StrUtil.format(...)`改为父类直接调用,例如: ```java // 原代码(假设StrUtil继承自StringUtils) StrUtil.format("参数错误: {}", param); // 修改后 StringUtils.format("参数错误: {}", param); // 直接通过父类调用静态方法[^3] ``` 3. **检查其他类似问题** 全局搜索代码中通过子类调用父类静态成员的情况(如`PageHelper.offsetPage()`改为`PageMethod.offsetPage()`[^5])。 --- ### 问题2:如何将JSON中的`code`和`msg`赋值给`BusinessException`的属性? **实现方法:** 1. **使用JSON反序列化** 通过JSON库(如FastJSON)将JSON字符串直接反序列化为`BusinessException`对象: ```java String jsonStr = "{\"code\":1001,\"msg\":\"参数无效\"}"; BusinessException exception = JSON.parseObject(jsonStr, BusinessException.class); // 通过父类JSON调用[^5] ``` 2. **确保字段映射正确** `BusinessException`类需包含与JSON键名匹配的字段及Setter方法: ```java public class BusinessException extends RuntimeException { private int code; private String message; // Getter & Setter } ``` 3. **处理字段名不一致的情况** 若JSON键名与类字段名不匹配,可使用注(如`@JSONField`)指定映射: ```java public class BusinessException { @JSONField(name = "code") private int errorCode; @JSONField(name = "msg") private String errorMessage; } ``` --- ### 关键注意事项 1. **静态方法调用规范** 始终通过定义静态成员的基类访问静态方法,避免使用子类名称,以提高代码清晰度[^1][^3]。 2. **空值安全处理** 析JSON时,优先使用`StrUtil.isBlank()`代替`String.isEmpty()`,防止空指针异常[^4]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

thinkgame

希望能够帮到你!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值