用于识别解析错误的默认值(字符串 ->双精度/任意数字)



在使用"默认值"而不是异常时,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();
  }
}

最新更新