在使用“默认值”而不是异常时检查无效解析结果的 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 或 POSITIVE_INFINITY 或 MAX_VALUE 或任何其他未使用的值。现在我会使用Optional-class。使用整数并不可靠,因为会进行转换,而使用 null 是 Hoares 十亿美元的错误:null 是否意味着错误、未初始化、未给出?输入字符串是否为空,或者是否已解析且不是有效的 double 表示形式?
基本上,您不希望有一个方法在出现解析错误或空输入或用户输入默认值时返回默认值。您需要一个方法来返回是否有错误的信息,如果没有则返回解析后的值。 为了使您的代码更具可读性和更容易理解,我会编写这样一个方法,并在适当的地方使用它(而不是到处复制粘贴解决方法)。如果您无法将其放入现有的实用程序类中,请创建您自己的附加实用程序类。 如果您使用Java 8,则可以使用Optional-class。如果没有,则编写您自己的可选代码(或从某个库中获取它)。 下面是实用方法:
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。 当调用者需要知道确切的原因时,您可以向您的Optional(或派生类)添加一个方法 getEmptyReason() 并将异常原因存储在那里。但我想在您的情况下,如果未给出输入字符串(空或空),您希望使用默认值,并且如果给出了该值但无法解析,则希望进行错误处理。在这种情况下,您可以使用:
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();
}
}
关于java - 用于识别解析错误的默认值(字符串 -> double /任何数字),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56074501/