Java 使用parseDouble检查null的较短方法?

Java 使用parseDouble检查null的较短方法?,java,Java,amountStr是一个偶尔包含双精度值(表示为字符串)的值 我想使用Double.parseDouble将其读入Double变量:amountDbl this.amountDbl = Double.parseDouble(amountStr); 如果amountStr没有值,它似乎会抛出一个NullPointerException 这是不是意味着我每次都要写一张这样的支票 if(amountStr!=null) this.amountDbl = Double.parseDouble(

amountStr
是一个偶尔包含双精度值(表示为字符串)的值

我想使用
Double.parseDouble
将其读入
Double
变量:
amountDbl

this.amountDbl = Double.parseDouble(amountStr);
如果
amountStr
没有值,它似乎会抛出一个
NullPointerException

这是不是意味着我每次都要写一张这样的支票

if(amountStr!=null)
    this.amountDbl = Double.parseDouble(amountStr);

因为我的代码中有这么多这样的语句,所以我希望有一种更简洁的方法来执行此检查(或避免它)。

如果使用:

或者编写自己的实用函数

public static double parseDoubleOrNull(String str) {
    return str != null ? Double.parseDouble(str) : 0;
}

this.ammountDbl = parseDoubleOrNull(ammountStr);
但是请注意,这并不能保护您免受格式不正确的双重攻击。如果这是一个问题,我建议您使用实用程序函数并执行以下操作:

public static double parseDoubleSafely(String str) {
    double result = 0;
    try {
        result = Double.parseDouble(str);
    } catch (NullPointerException npe) {
    } catch (NumberFormatException nfe) {
    }
    return result;
}
如果你想要简洁的代码,你甚至可以

import static pkg.UtilClass.parseDoubleSafely;

为什么不事先将其初始化为“默认”值

然后,当您使用该变量时,检查该特殊情况

if (amountDbl != /* some default value */)
    //parse it

您可以始终使用try/catch或使用三元运算符(正如aioobe所做的那样)


虽然没有多大改善,但您可以:

this.amountDbl = Double.parseDouble(amountStr==null ? "" : amountString);
  • 为在构造函数/工厂中处理此测试的数量创建一个包装类,或将空数量作为特殊情况处理,例如
  • 使用一个Java实用程序库,比如guava,它实现了一个
  • Google Guava有一个
    T firstNonNull(T first,T second)
    可以用作
    Double.parseDouble(Objects.firstNonNull(amountStr,“0”)

  • (切换到Scala并使用)

我用这个:

Double.parseDouble(str.isEmpty()?“0”:str)


Double.parseDouble((str==null | | str.isEmpty())?“0”:str)

回答这个问题可能要晚几年。org.apache.commons.lang3.math包中的NumberUtils类有一个createDouble方法,该方法可以满足您的要求()


A A=新A(value1,value2==null?null:Double.parseDouble(value2),value3….)

如果某个对象上的某个操作抛出了一个
NullPointerException
,那么除了检查该对象是否为null之外,您还需要做什么呢?检查
null
的计算时间必须比解析部分短数千倍。啊,捕获运行时异常,尤其是NPE听起来不是很好,是吗?如果try块只包含一个对静态方法的调用,我认为捕获npe是可以的。好吧,你总是可以把它缩小到只捕获(NullPointerException npe){…}捕获(NumberFormatException nfe){…}这是个坏主意,因为
Double.parseDouble(“”
抛出了NumberFormatException,我假设这段代码已经包装在try..catch中了。如果amountStr中没有有效的数字,您需要处理NumberFormatException。
Double.parseDouble(amountStr==null?.0:amountString)可能是一个更好的主意。我想这取决于你想如何处理无效的双精度。您想默认为某个数字,还是想退出,或者记录、跳过并继续。有很多可能性。你也可以将效用函数标记为final。这将启用内联。如果它是静态的,则无论如何都不能被重写。我喜欢使用实用程序函数的建议,这样OP的文件中就不会出现空值测试。@Alexey-根据这个线程:最终结果对内联没有影响,至少在热点中是这样。@CPerkins是的,我必须同意。而且
静态
方法不能被重写。我想知道用什么来代替
默认
来进行键入
amountStr!=默认值
amountStr!=空
。它当然不会改变代码的结构。您不应该建议这样做,因为它不可读,并且在0的情况下会执行不必要的解析调用。这样,它不是一段好代码
if (amountDbl != /* some default value */)
    //parse it
try{
   this.amountDbl = Double.parseDouble(amountStr);
} catch (Exception ex){
ex.printStackTrace();
}
this.amountDbl = Double.parseDouble(amountStr==null ? "" : amountString);