递归陷入死循环的判断方法与解决措施(java代码)
在項(xiàng)目中遇到遞歸的方法總是讓人頭疼,因?yàn)闃I(yè)務(wù)或者算法上的復(fù)雜性,常常需要一個(gè)方法或者兩個(gè)方法,甚至多個(gè)方法之間進(jìn)行遞歸,那么怎么解決方法遞歸中可能會(huì)存在的死循環(huán)問(wèn)題呢?下面是我在項(xiàng)目中的一些嘗試(僅做思路參考):
首先看一下什么是死循環(huán):
一個(gè)方法的死循環(huán):
public class OneMethod {public static void main(String[] args) {String string = "冰墩墩";iteration(string);}public static String iteration(String string) {return iteration(string);} }代碼的運(yùn)行結(jié)果如下:
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). . . . . .?可以看到棧溢出了,說(shuō)明一直在循環(huán)棧內(nèi)存已經(jīng)被占滿。
兩個(gè)方法之間的死循環(huán):
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);} }結(jié)果和一個(gè)方法死循環(huán)是一樣的,?java.lang.StackOverflowError報(bào)錯(cuò),棧溢出。
上面兩個(gè)簡(jiǎn)單的死循環(huán)的例子可以說(shuō)明遞歸陷入死循環(huán)的判斷依據(jù):在經(jīng)過(guò)某一固定程序之后,周期性調(diào)用相同方法名且傳入相同的參數(shù)值,從而造成程序執(zhí)行出現(xiàn)異常終止。
主要思路:
怎么及時(shí)發(fā)現(xiàn)程序陷入死循環(huán)?
首先根據(jù)死循環(huán)的判斷依據(jù):周期性調(diào)用相同方法名傳入相同參數(shù)。那么只需要判斷這個(gè)方法連續(xù)或非連續(xù)(多線程)傳入的參數(shù)是不是和之前一樣就可以了,這里我定義了兩個(gè)靜態(tài)參數(shù),一個(gè)是這個(gè)方法當(dāng)前傳入的參數(shù)(這里暫時(shí)定為一個(gè)),另一個(gè)參數(shù)是連續(xù)傳入的參數(shù)的次數(shù),只要傳入?yún)?shù)和當(dāng)前參數(shù)不一樣,那么就將當(dāng)前參數(shù)進(jìn)行修改覆蓋,計(jì)數(shù)置為0。這樣在計(jì)數(shù)達(dá)到一定值(10或20或100,具體視業(yè)務(wù)的復(fù)雜程度)的時(shí)候就判定此方法陷入了死循環(huán)。
發(fā)現(xiàn)死循環(huán)之后需要讓程序執(zhí)行什么操作呢?
在發(fā)現(xiàn)死循環(huán)之后及時(shí)拋出異常或者直接try、catch塊處理掉,使程序輸出日志轉(zhuǎn)為正常執(zhí)行(在不影響實(shí)際業(yè)務(wù)邏輯的前提下)。
基于以上兩點(diǎn)的考慮,初步實(shí)現(xiàn),代碼如下:
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);} }總結(jié)
以上是生活随笔為你收集整理的递归陷入死循环的判断方法与解决措施(java代码)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
 
                            
                        - 上一篇: 【Opencv综合应用】自制训练集的人脸
- 下一篇: TT数鸭子
