将异常用于逻辑是否是错误的做法

时间:2019-02-15 11:57:32

标签: java performance exception logic

我需要检查给定的字符串在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;  
}

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

2 个答案:

答案 0 :(得分:3)

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

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

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

这里有一篇文章正在回顾您所付出的代价到底有多大,您会发现自己的代价确实很小,如果您没有一个特殊的案例来优化,那么您应该顺其自然{{3 }}

这里进行了1亿次迭代,差别只是几毫秒:

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

答案 1 :(得分:1)

如果可能,请在程序的 normal 流中尽量不要使用异常。 在Java中,异常处理的速度非常慢,因此,如果在程序的常规执行期间抛出并捕获了许多异常,可能会对性能产生严重影响。

当然也有例外。如上所述,除了使用异常来检查有效性外,别无选择。

如果您确实控制代码本身,则异常仅在不常见情况下抛出,也算不错。如果您希望程序非常定期地遇到异常,请尝试寻找其他方法。