【问题标题】:Is it a bad practice to use Exceptions for logics [closed]将异常用于逻辑是否是一种不好的做法[关闭]
【发布时间】:2019-02-15 11:57:31
【问题描述】:

我需要检查给定字符串在 Java 中是否是有效的 JSON。

我使用 google gson 的简单方法是:

 public static boolean isValidJson(String str) {
  try {
      gson.fromJson(str, Object.class);
      return true;
  } catch(com.google.gson.JsonSyntaxException ex) { 
      return false;
  }
}

我们可以将任何 JSON 解析器用于相同的逻辑,但我还没有看到任何内置方法来验证 json。

另一个经典的例子是,一个用于检查数字的自定义函数:

public static boolean isNumeric(String str)  
{  
  try  
  {  
    double d = Double.parseDouble(str);  
  }  
  catch(NumberFormatException nfe)  
  {  
    return false;  
  }  
  return true;  
}

我的问题是:以这种方式对逻辑使用异常可以吗?或者这是一种不好的做法?

【问题讨论】:

  • 使用Double.parseDouble(str); 并捕获NumberFormatException 是实用性问题。没有boolean Double.canParse(String) 方法,因此开发人员很可能使用try/catch 来验证输入。 JSON 验证也是如此。 但是当你开发你的 API 时,避免强迫你的用户依赖抛出的异常。在这种情况下提供boolean返回方法。

标签: java performance exception logic


【解决方案1】:

您使用异常的方式很好。 从长远来看,微优化不会让您受益。

当您编写代码时,您应该尽量平衡性能与可读性和可维护性

从性能的角度来看,尝试捕获异常的代价并不大。它不能证明编写不可读或不可维护的代码是合理的。

这是一篇文章,它正在审查您自己看到的惩罚到底是多少,惩罚真的很小,如果您没有特定的案例可以优化优化,您应该按照流程进行Do try/catch blocks hurt performance when exceptions are not thrown?

这里对于 10 000 000 次迭代,差异只有几毫秒:

00:00:00.4269033  // with try/catch
00:00:00.4260383

【讨论】:

    【解决方案2】:

    如果可能,尽量不要在程序的正常流程中使用异常。 Java 中的异常处理非常慢,因此如果在程序的常规执行过程中抛出和捕获大量异常,则会对性能产生严重影响。

    当然也有例外。正如您在上面提到的,除了使用异常来检查有效性之外别无选择。

    如果你确实控制了代码本身,那么异常也不错,如果它们只会在不寻常的情况下被抛出。如果您希望您的程序经常遇到异常,请尝试寻找其他方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-12
      • 2011-06-11
      • 1970-01-01
      • 2014-01-03
      • 1970-01-01
      • 2019-12-30
      • 2017-05-08
      • 2019-05-01
      相关资源
      最近更新 更多