【发布时间】:2021-04-25 13:37:32
【问题描述】:
昨天我不得不写一段丑陋的代码,为了对一个对象的字段执行许多空检查,以避免来自三元运算符构造的 NPE。
有问题的代码:
ResourceThresholds rt = getThresholdsFromConfig();
Thresholds defaultPerContainer = getDefaultThresholds();
return new Thresholds((!rt.getCpu().equals("")) ? Long.parseLong(rt.getCpu()) : defaultPerContainer.getCpu(),
(!rt.getMemory().equals("")) ? Long.parseLong(rt.getMemory()) : defaultPerContainer.getMemory(),/*omitted for brevity*/);
我在 defaultPerContainer.getCpu() 上获得了 NPE,因为字段 cpu = null。
这很好,Java 按照它的工作方式工作。
为什么我不只是默认字段 Long cpu = 0L; ?因为我需要null 值作为我们不设置任何值的指标。
这段特定代码的最终功能变体是:
Long cpuVal;
if (!rt.getCpu().equals("")) {
cpuVal = Long.parseLong(rt.getCpu());
} else {
cpuVal = defaultPerContainer.getCpu();
}
Long memory;
if (!rt.getMemory().equals("")) {
memory = Long.parseLong(rt.getMemory());
} else {
memory = defaultPerContainer.getMemory();
}
//... many similar if-elses that give me the desired value;
//which is really ugly, and I believe I am not the only one hitting this.
return new Thresholds(cpuVal, memory..);
这段代码可以按我的需要工作,但它很丑!
Q1:有人可以提示我是否可以找到使用Optional<T> 的方法来解决带有三元运算符的第一个变体中的 NPE?因为这个 sn-p 有效:!rt.getCpu().equals("")) ? Long.parseLong(rt.getCpu()) : null 即如果我明确地将null 作为一个值,我会在满足条件时得到null。
一般来说,有没有优雅的 Java 8+ 方法来处理这个问题?
Q2:您如何优化出色的 if-else 构造以进行空值检查?
【问题讨论】:
-
@DawoodibnKareem 是的
-
@DawoodibnKareem java.lang.Long
-
好的,我想我知道发生了什么。如果您将
?和:之间的部分完全更改为new Long(rt.getCpu()),您是否仍然遇到问题?如果这样可以解决,那是因为三元运算导致“真”和“假”部分都被解释为long而不是Long。 -
我仍然得到 NPE,逻辑上正确的第三个操作数是 ((Long) defaultPerContainer.getCpu())。一般来说,我认为你不能投空? (defaultPerContainer.getCpu() 返回 null!)
标签: java nullpointerexception null-check