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==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);