当前位置: 首页 > 知识库问答 >
问题:

Java:如何避免三元运算符中的NPE,如何优雅地执行空值检查?[副本]

郑卜鹰
2023-03-14

昨天我不得不写了一段难看的代码,以便对一个对象的字段执行许多空检查,以避免来自三进制运算符构造的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*/);
        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..);

Q2:如何优化用于空检查的光荣if-else构造?

共有1个答案

苏畅
2023-03-14

问题是在三进制表达式A?B:C,如果BC都是兼容的数字类型,但一个是装箱对象,另一个是原语,大多数人会认为结果是装箱的,通过自动装箱原语。

事实并非如此。三值运算符将对象解框,因此它们都是原语,结果是一个原语。

这意味着以下内容是相同的:

long B = ...;
Long C = ...;

Long R = ... ? B : C;

Long R = (Long) (... ? B : (long) C);
Long R = ... ? (Long) B : C;

通过该更改,一个nullC值将简单地设置R=null

在问题中的例子中,blong.parselong(rt.getcpu()),所以不要添加强制转换来强制自动装箱,而是使用long.valueof(String s)

另外,与此无关的是,使用isempty()代替equals(“”),并且不需要在A周围加上圆括号。

将代码更改为:

return new Thresholds(!rt.getCpu().isEmpty() ? Long.valueOf(rt.getCpu()) : defaultPerContainer.getCpu(),
                      !rt.getMemory().isEmpty() ? Long.valueOf(rt.getMemory())  : defaultPerContainer.getMemory(),
                      /*omitted for brevity*/);
 类似资料:
  • 一个超级简单的问题: 下面是我使用传统三元运算符的普通Java代码

  • 问题内容: 说我有价值,和。我想找出它们是否相等。如果我做 然后我得到一个编译错误 这很明显,因为它解析为: 并且是布尔。 我当然可以做: 但是,这看起来不太好,让人感到困惑。还有另一种方法吗? 问题答案: 事先注意: 如果三个值相等, 则 最后提出的解决方案 是 最短,最清晰和最有效的比较方法: 或者(根据您的喜好): 这个答案的其余部分(以下内容)只是与语言规范和语言功能有关,展现了我发现的有

  • 我需要检查一些值是否为空。如果它不为空,那么只需将某个变量设置为true。这里没有别的说法。我做了太多这样的检查。 有没有什么方法可以在不检查所有方法返回值的情况下处理这个空检查? 我想直接检查变量并忽略NullPointerException。这是一个好的做法吗?

  • 问题内容: 考虑这一行: 显然,这行是潜在的错误,属性可能是,我们将获得。因此,我们需要将其重构为以下两种选择之一: 第一种选择: 第二种选择: 第一种选择阅读时比较笨拙,但更为简洁;第二种选择的意图很明确,但很冗长。 就可读性而言,您更喜欢哪个选项? 问题答案: 我一直都在用 因为尽管阅读起来有点困难,但是它的冗长程度要小得多,而且我认为它足够易读,因此您可以很容易地习惯它

  • 我有如下所示的JSON 我将文件读成字符串并创建一个JSONObject,如下所示 然而,我认为我可以用try catch将语句括起来 请建议在这种情况下是否有任何合理的理由放一个长的if条件,而不是仅仅try-catch-log然后继续。 您还可以分享使用JSONException在此上下文中是否有任何“优点”吗?

  • 问题内容: 我需要检查某个值是否为null。如果它不为null,则将一些变量设置为true。这里没有其他声明。这样的条件检查太多了。 有什么方法可以在不检查所有方法返回值的情况下处理此空检查? 我认为直接检查变量并忽略NullpointerException。这是一个好习惯吗? 问题答案: 不,在Java中捕获NPE而不是对您的引用进行空检查通常不是一个好习惯。 如果您愿意,可以使用这种东西: 或