递归陷入死循环的判断方法与解决措施(java代码)
在項目中遇到遞歸的方法總是讓人頭疼,因為業務或者算法上的復雜性,常常需要一個方法或者兩個方法,甚至多個方法之間進行遞歸,那么怎么解決方法遞歸中可能會存在的死循環問題呢?下面是我在項目中的一些嘗試(僅做思路參考):
首先看一下什么是死循環:
一個方法的死循環:
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代码)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Opencv综合应用】自制训练集的人脸
- 下一篇: TT数鸭子