String.valueOf 的值为“null”的坑

本文探讨了在处理从参数映射中获取的值时,如何正确转换为字符串以防止SQL注入错误。通过示例代码说明了直接使用Object类型可能导致的问题,并提供了安全的转换方法。

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

String regOrgCn = String.valueOf(parmMap.get("regOrgCn"));
            if(StringUtils.isNotBlank(entname)){
                sql.append(" and tt.entname like :entname ");
                map.put("entname",entname);
            }

这里的  parmMap.get("regOrgCn") 如果是 null  , 那么这里的 regOrgCn 就是 “null” ,这是一个值为 null 的字符串。

导致数据会拼接到SQL 中,导出出错。

这里 parmMap.get("regOrgCn") 是Object , 可以是强转 如下:

String regOrgCn = (String)parmMap.get("regOrgCn");

就可以避免上述问题。

<think>好的,用户的问题是希望优化当`String.valueOf`处理`null`时,`contentBuilder.append`的内容展示,避免显示"null"这样的字符串。首先,我需要分析当前的问题:当`part.getXXX()`返回`null`时,`String.valueOf`会将其转为"null",导致拼接后的变更信息显示为“数量由100变更为null”,这不符合实际业务需求。 接下来,我需要考虑如何处理`null`,使其在展示时更友好。常见的优化方式是将`null`替换为业务中更易理解的描述,比如“无”、“空”或“未填写”。同时,需要确保在比较时正确处理`null`情况,避免错误地认为`null`和非`null`存在变更。 然后,我需要修改代码中的`String.valueOf`部分,添加对`null`的判断。例如,当`part.getQty()`为`null`时,使用自定义的字符串(如“无”)代替"null"。同时,需要调整比较逻辑,确保只有当实际发生变化时才拼接变更信息。 另外,还需要考虑`dm`的属性可能为`null`的情况,比如`dm.getQty()`为`null`时,如何处理其展示。可能需要统一对`dm`和`part`的属性进行`null`转换,确保比较和展示的一致性。 最后,需要验证修改后的代码是否会导致空指针异常,确保所有可能为`null`的情况都被覆盖,比如`part`本身是否为`null`(但根据用户提供的代码,`part`已经通过`part != null`校验,所以不需要额外处理)。 总结优化步骤: 1. 对`part.getXXX()`的结果进行`null`判断,替换为友好提示(如“无”)。 2. 对`dm.getXXX()`的结果同样进行`null`处理,保持展示一致性。 3. 调整比较逻辑,确保只有真实变更时才拼接信息。 4. 避免因`null`转换导致的错误比较(如`dm.getQty()`为`null`时,`part.getQty()`为`null`应视为未变更)。 </think>要优化 `String.valueOf` 处理 `null` 时的 `append` 内容展示,可以通过自定义方法将 `null` 转换为业务友好的描述(如“无”、“空”等),并统一处理 `dm` 和 `part` 的属性避免显示 `"null"` 字符串。以下是优化后的代码示例: ### 优化方案: ```java // 自定义工具方法:将 null 转换为友好描述(如 "无"),非 null 则返回原字符串 private String getDisplayValue(Object value) { return value == null ? "无" : String.valueOf(value); } // 原代码优化后: if (part != null) { // 处理数量变更 String dmQty = dm.getQty(); String partQty = part.getQty(); if (dmQty != null && !dmQty.isEmpty()) { String dmQtyDisplay = getDisplayValue(dmQty); // dm 的非空时直接展示 String partQtyDisplay = getDisplayValue(partQty); // part 的可能为 null,转换为 "无" if (!String.valueOf(partQty).equals(dmQty)) { // 比较原始避免 "无" 干扰比较逻辑) contentBuilder.append("数量由" + dmQtyDisplay + "变更为" + partQtyDisplay + ","); } } // 处理编码变更(类似逻辑) String dmPartNo = dm.getPartNo(); String partItemCode = part.getItemCode(); if (dmPartNo != null && !dmPartNo.isEmpty()) { String dmPartNoDisplay = getDisplayValue(dmPartNo); String partItemCodeDisplay = getDisplayValue(partItemCode); if (!String.valueOf(partItemCode).equals(dmPartNo)) { contentBuilder.append("编码由" + dmPartNoDisplay + "变更为" + partItemCodeDisplay + ","); } } // 处理描述变更(类似逻辑) String dmPartDesc = dm.getPartDesc(); String partItemDesc = part.getItemDesc(); if (dmPartDesc != null && !dmPartDesc.isEmpty()) { String dmPartDescDisplay = getDisplayValue(dmPartDesc); String partItemDescDisplay = getDisplayValue(partItemDesc); if (!String.valueOf(partItemDesc).equals(dmPartDesc)) { contentBuilder.append("描述由" + dmPartDescDisplay + "变更为" + partItemDescDisplay + ","); } } // 处理备注变更(类似逻辑) String dmRemark = dm.getRemark(); String partRemark = part.getRemark(); if (dmRemark != null && !dmRemark.isEmpty()) { String dmRemarkDisplay = getDisplayValue(dmRemark); String partRemarkDisplay = getDisplayValue(partRemark); if (!String.valueOf(partRemark).equals(dmRemark)) { contentBuilder.append("备注由" + dmRemarkDisplay + "变更为" + partRemarkDisplay + ","); } } } ``` ### 优化说明: 1. **`getDisplayValue` 方法**: 将 `null` 统一转换为业务友好的描述(如“无”),避免 `"null"` 字符串显示。例如: - 若 `part.getQty()` 为 `null`,`getDisplayValue(part.getQty())` 返回 `"无"`; - 若 `part.getQty()` 为 `100`,则返回 `"100"`。 2. **分离“展示”和“比较”**: - **比较逻辑**:使用 `String.valueOf(part.getXXX())` 比较原始(包括 `null` 转为 `"null"`),确保判断是否真的发生变更(例如 `part.getQty()` 为 `null` 时,`String.valueOf` 得到 `"null"`,与 `dm.getQty()` 的原始比较); - **展示逻辑**:使用 `getDisplayValue` 处理后的友好描述,避免用户看到 `"null"`。 3. **兼容 `dm` 属性为 `null` 的情况**: 原代码已通过 `dm.getXXX() != null && !dm.getXXX().isEmpty()` 过滤了 `dm` 属性为 `null` 或空的情况,因此只需关注 `dm` 属性非空时的展示。 ### 扩展优化(可选): 若希望 `dm` 的属性为 `null` 时也参与展示(例如“数量由无变更为100”),可以进一步调整逻辑,移除 `dm.getXXX() != null && !dm.getXXX().isEmpty()` 的限制,并统一处理 `dm` 和 `part` 的 `null` : ```java // 调整后的比较逻辑(允许 dm 属性为 nullString dmQty = dm.getQty(); String partQty = part.getQty(); String dmQtyDisplay = getDisplayValue(dmQty); // dm 为 null 时展示 "无" String partQtyDisplay = getDisplayValue(partQty); // part 为 null 时展示 "无" if (!String.valueOf(dmQty).equals(String.valueOf(partQty))) { // 比较原始(包括 null) contentBuilder.append("数量由" + dmQtyDisplay + "变更为" + partQtyDisplay + ","); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值