在项目中遇到递归的方法总是让人头疼,因为业务或者算法上的复杂性,常常需要一个方法或者两个方法,甚至多个方法之间进行递归,那么怎么解决方法递归中可能会存在的死循环问题呢?下面是我在项目中的一些尝试(仅做思路参考):

首先看一下什么是死循环:

一个方法的死循环:

public class OneMethod {public static void main(String[] args) {String string = "冰墩墩";iteration(string);}public static String iteration(String string) {return iteration(string);}
}

代码的运行结果如下:

Exception in thread "main" java.lang.StackOverflowErrorat ssl.study.iteration.OneMethod.iteration(OneMethod.java:17)at ssl.study.iteration.OneMethod.iteration(OneMethod.java:17)at ssl.study.iteration.OneMethod.iteration(OneMethod.java:17). . . . . . 

可以看到栈溢出了,说明一直在循环栈内存已经被占满。

两个方法之间的死循环:

public class TwoMethod {public static void main(String[] args) throws Throwable {String string = "冰墩墩";iteration1(string);}public static String iteration1(String string) {return iteration2(string);}public static String iteration2(String string) {return iteration1(string);}
}

结果和一个方法死循环是一样的, java.lang.StackOverflowError报错,栈溢出。

上面两个简单的死循环的例子可以说明递归陷入死循环的判断依据:在经过某一固定程序之后,周期性调用相同方法名且传入相同的参数值,从而造成程序执行出现异常终止。

主要思路:

怎么及时发现程序陷入死循环?

首先根据死循环的判断依据:周期性调用相同方法名传入相同参数。那么只需要判断这个方法连续或非连续(多线程)传入的参数是不是和之前一样就可以了,这里我定义了两个静态参数,一个是这个方法当前传入的参数(这里暂时定为一个),另一个参数是连续传入的参数的次数,只要传入参数和当前参数不一样,那么就将当前参数进行修改覆盖,计数置为0。这样在计数达到一定值(10或20或100,具体视业务的复杂程度)的时候就判定此方法陷入了死循环。

发现死循环之后需要让程序执行什么操作呢?

在发现死循环之后及时抛出异常或者直接try、catch块处理掉,使程序输出日志转为正常执行(在不影响实际业务逻辑的前提下)。

基于以上两点的考虑,初步实现,代码如下:

public class TwoMethod {static int ITERATION_COUNT = 0;static String IN_METHOD_STRING;private static Object Exception;public static void main(String[] args) throws Throwable {String string = "冰墩墩";iteration1(string);}public static String iteration1(String string) throws Throwable {if (!string.equals(IN_METHOD_STRING)) {IN_METHOD_STRING = string;ITERATION_COUNT = 0;}else {ITERATION_COUNT += 1;}if (ITERATION_COUNT == 10) {System.out.println(ITERATION_COUNT);throw (Throwable) Exception;}return iteration2(string);}public static String iteration2(String string) throws Throwable {return iteration1(string);}
}

递归陷入死循环的判断方法与解决措施(java代码)相关推荐

  1. 计算机硬件故障检查诊断的原则,试论计算机硬件故障的识别方法与解决措施

    摘要:经济的发展和科技的进步使得计算机得以普及.计算机的已经成为工业.经济.管理等众多方面的重要运行手段,甚至已经成为了普通居民工作.生活.娱乐的一部分. 关键词:计算机硬件:识别方法:解决措施 中图 ...

  2. 三相电压不平衡的判断方法和解决办法

    安科瑞 华楠 在日常的工作中,时常会遇见三相不平衡现象,我们又如何去分析和解决呢?下面跟小编一起来充电学习吧- 引起三相电压不平衡的原因有多种,如:单相接地.断线谐振等,运行管理人员只有将其正确区分开 ...

  3. 在JDBC中异常方法的解决之java,sql.SQLException:Can not issue data manipulation statements with executeQuery();

    1-java,sql.SQLException:Can not issue data manipulation statements with executeQuery(); 这个异常是说不可以用ex ...

  4. matlab程序转java_用面向对象的方法将一段JAVA代码转化为matlab

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 public class Variable { /*list of variables this variable is connected to. */ ...

  5. java 改为matlab_用面向对象的方法将一段JAVA代码转化为matlab

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 public class Variable { /*list of variables this variable is connected to. */ ...

  6. java 判断手机访问_下面java代码判断是手机访问还是PC访问什么地方出错了,手机跳转不到制定页面,等待解答...

    最近在做一个项目,要在判断用户是否是通过手机访问网站的,如果是手机访问网站跳到一个登录页面,如果是用户用电脑访问网站跳到另外一个登录页面.我写了以下代码,但是用手机访问网站的时候,跳转不到制定页面,请 ...

  7. 【菜鸡学算法】用最笨最直观的方法讨论递归取中值时是不是陷入死循环

    错题本:分治 取中值(mid = l + r (?+1?) >> 1) 中的 l r i j 是否陷入递归死循环 所谓少壮不知道,老大徒伤悲. 被很简单的快排 代码运行状态: Memory ...

  8. java 异步调用方法_乐字节Java编程之方法、调用、重载、递归

    一.概述 方法是指人们在实践过程中为达到一定目的和效果所采取的办法.手段和解决方案. 所谓方法,就是解决一类问题的代码的有序组合,是一个功能模块.编程语言中的方法是组合在一起来执行操作语句的集合.例如 ...

  9. shell 死循环if判断_运维小技巧(2):shell函数

    shell函数是什么 shell函数可以看作是一组shell命令的组合,用来完成一个特定的功能,它的功能和java中的方法类似. 2. shell函数长什么样 铛铛铛,先上代码. function l ...

最新文章

  1. 制胜人工智能时代——企业人工智能应用现状分析(第三版)
  2. VS下对Resx资源文件的操作
  3. 一个好的设计应当具备哪些要素
  4. ensp启动设备蓝屏_为什么早期的Windows经常死机蓝屏,现在却很少发生?这些你都知道吗?...
  5. 为什么只有三次挥手_TCP为什么是三次握手,为什么不是两次或四次,TCP四次挥手...
  6. BZOJ2038: [2009国家集训队]小Z的袜子(hose)
  7. atm机java+gui+oracle编程代码_java应用在哪里?
  8. qlineedit文本改变时_PyQt5 QLineEdit(单行编辑器) 学习
  9. python 字符串删除重复_Python删除list里的重复元素有几种方法?
  10. 在.NET环境禁止别人调用代码
  11. 苹果官方首次松口:新款iPhone SE有望近期亮相
  12. 组建优秀的团队-实现目标的开始
  13. IN改写关联注意事项!
  14. php5.6软件下载,【PHP下载】PHP for Linux 5.6.6-ZOL软件下载
  15. 数字藏品文博周将至,拙政园主题数字藏品全网首发
  16. 蜡笔小新鸿蒙系统,盘点蜡笔小新最污的四处剧情,网友:当年太纯洁现在终于看懂!...
  17. ShowWindow函数用法。
  18. 若菜光个人小档案(dambolo)
  19. 如何开通电子邮箱的SMTP功能
  20. 警告: A docBase E:/Tomcat/webapps/Test inside the host appBase has been specified, and will be ignored

热门文章

  1. 三顾讯时--对讯时新闻发布系统的艰难突破
  2. 模拟外线O口呼入时,看不到来电显示号码?
  3. Angular + PrimeNG 安装配置
  4. 两张人脸图像比对ocr技术
  5. bootstrap文档第一遍
  6. DVI接口关于技术性的知识导论
  7. 计算机 绘图 教案,计算机绘图2教案.doc
  8. 微带线与带状线的区别
  9. 一键重装系统win8图文教程
  10. html在线ocr文字识别源码,如何用OCR文字识别软件把图像转换成HTML