在使用"默认值"而不是异常时,Java中最佳练习是什么最佳实践?
我正在从事的(旧生长的(项目具有将String
解析为double
的故障安全效应方法,例如:
//null checks, LOG output etc removed for readability
double parseDouble(String input, double defaultValue){
try{
return Double.parseDouble(input)
} catch (Exception e){
return defaultValue;
}
}
现在,以前的开发人员始终使用诸如returnedValue = parseDouble(someString, -99);
之类的默认值和if(returnedValue == -99)
之类的检查来识别无效的解析结果。(最后(添加了Sonarqube服务器,请使用double
上的==
抱怨此检查,我想用"正确"检查替换这些检查。
处理此类案件的最佳做法是什么?
我个人会使用 parseDouble(someString, Double.NaN);
及检查if(Double.isNan(returnedValue)
。这是一个可行的解决方案吗?
编辑:我忘了提到,公用事业类是不可编辑的(从我的角度来看(,因此我正在研究如何轻松"修复"现有代码。另外,添加第三方库会很好,但是(此时(也无法。
在过去,我也将与nan或usature_infinity或max_value或其他未使用的其他人一起使用。现在,我将使用可选类。使用整数由于转换而无法可靠,而使用null是hoares是一亿美元的错误:null含义错误,不是初始化的,未给出吗?输入字符串null还是被解析的,这不是有效的双重表示?
基本上,您不希望在出现解析错误或null输入或用户输入默认值时为您提供默认值的方法。您需要一种可以使您提供信息的方法是否存在错误,如果不是错误,则解析值。为了使您的代码更容易读取,更容易理解,我将精确地编写这样的方法,并在适当的地方使用它(而不是到处复制抛光解决方法(。如果您不能将其放入现有的公用事业类中,请自己进行额外的公用事业类。如果您使用的是Java 8,则可以使用可选类。如果没有,请编程自己的可选(或从某些库中获取(。这是实用方法:
Optional<Double> parseDouble(String input) {
try {
return Optional.of(Double.parseDouble(input));
} catch (Exception e) {
return Optional.empty();
}
}
这是如何使用它:
String input = ...;
Optional<Double> parsedInput = parseDouble(input);
if (! parsedInput.isPresent()) {
// print out warning and retry input or whatever
}
double convertedInput = parsedInput.value();
注释:
Sonarqube还会批评一个常见的"例外"。相反,您应该捕获NumberFormateXception和NullPoInterException。当呼叫者需要知道确切的原因时,您可以在可选(或派生的类(中添加方法getementAsison((并在此处存储异常原因。但是我想,在您的情况下,如果未给出输入字符串(空或空(,则要使用默认值,如果给出该值但无法避免,则要进行错误处理。在这种情况下,您可以使用:
Optional<Double> parseDouble(String input, double defaultValue) {
if (input == null || input.trim().length == 0) {
return Optional.of(defaultValue);
}
try {
return Optional.of(Double.parseDouble(input));
} catch (NumberFormatException e) {
return Optional.empty();
}
}