如何避免Java异常作为控制流使用

发布时间:2022-01-07 14:31:39 作者:iii
来源:亿速云 阅读:184

这篇文章主要讲解了“如何避免Java异常作为控制流使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何避免Java异常作为控制流使用”吧!

Java是一种通用的编程语言,它有着许多不同的方案去解决一些特殊的问题。然而,其中既有需要被遵循的最佳做法,也有一些仍被普遍使用的不良做法。

用异常(Exceptions)作为控制流就是这些常见的不良做法中的一种。要避免使用这一方法的原因有二:首先,这会降低单位时间内代码的响应性能,同时代码也会非常难读懂。

通过下面这个例子来看看异常是怎样被用作控制流的。这个代码的商业用例是:

publicstaticintfindAge(String name) {  try {  String ageAsString = findUser(name);  return ageAsString.length();  } catch (NameNotFoundException e) {  return0;  }  }  privatestaticStringfindUser(String name) {  if(name==null) {  thrownew NameNotFoundException();  }  return name;  }

如果用户提供了一个非空的名字给findAge  方法,那它会返回这个名字的长度。但是如果用户名为空,那么findUser方法会抛出NameNotFoundException,而在这种情况下,findAge  方法会返回0。

那该如何重构这个代码来避免异常呢?

老实说,有很多种办法可以实现,这里就只介绍一种。

publicstaticintfindAgeNoEx(String name) {  String ageAsString = findUserNoEx(name);  return ageAsString.length();  }  privatestaticStringfindUserNoEx(String name) {  if(name==null) {  return"";  }  return name;  }

为了找到异常对代码性能的影响,准备下面这个代码,其中两种实现都被执行了1000万次,Intel Core i7-3630QM  CPU上运行时,异常花费了上千毫秒。

publicclassControlFlowWithExceptionOrNot {  publicstaticclassNameNotFoundExceptionextends RuntimeException {  privatestaticfinallong serialVersionUID = 3L;  }  privatestaticfinalint TRIAL = 10000000;  publicstaticvoid main(String[] args) throws InterruptedException {  long start = System.currentTimeMillis();  for (int i = 0; i < TRIAL; i++) {  findAgeNoEx(null);  }  System.out.println("Duration :" + (System.currentTimeMillis() - start));  long start2 = System.currentTimeMillis();  for (int i = 0; i < TRIAL; i++) {  findAge(null);  }  System.out.println("Duration :" + (System.currentTimeMillis() - start2));  };  publicstaticint findAge(String name) {  try {  String ageAsString = findUser(name);  return ageAsString.length();  } catch (NameNotFoundException e) {  return0;  }  }  privatestaticString findUser(String name) {  if (name == null) {  thrownew NameNotFoundException();  }  return name;  }  publicstaticint findAgeNoEx(String name) {  String ageAsString = findUserNoEx(name);  return ageAsString.length();  }  privatestaticString findUserNoEx(String name) {  if (name == null) {  return"";  }  return name;  }  }

输出:

Duration :16  Duration :6212

如果来比较一下这两种findAge方法的可读性,可以发现没有异常的那个十分清晰,不管findUser方法返回什么,findAge方法都会得到它的长度,我们也很确信findUser方法会返回一个字符串。但是那个有异常的就会令人困惑,findUser方法返回不清晰,它可能返回一个字符串也可能抛出一个异常,而且这在方法的签名上是不可见的。正因为这样,函数式编程范式中不欢迎异常。

感谢各位的阅读,以上就是“如何避免Java异常作为控制流使用”的内容了,经过本文的学习后,相信大家对如何避免Java异常作为控制流使用这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

推荐阅读:
  1. Kotlin控制流指的是什么
  2. 控制流如何处理错误

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java

上一篇:常见Spring Boot面试问题有哪些

下一篇:c++显式栈如何实现递归

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》