我的主班有2种方法
public class pol{
public sub() {
//... do this
//... do this
//... do this
return result
}
public sub2()
// calling method sub() here
return result
}
}
有什么办法可以检测到我使用sub2()方法在sub()中写了一个无限循环吗?
我们可以设想一个场景,我正在使用sub()中的反射来加载一个类,然后在那儿执行它..
答案 0 :(得分:0)
只要它们在单个线程上运行,否。如果sub()中存在无限循环,操作将永远不会返回sub2()。
如果sub2()剥离了一个线程,该线程在sub()中启动了循环,则可能仍然无法实现。那实际上可能是一个暂停问题。 Sub2()可以与线程sub()进行交互,并在给定时间,给定迭代次数或其他条件下杀死它。如果您知道要检查的状态,则将导致无限循环sub2()可能会寻找该状态,并在状态进入状态时杀死sub(),但Thread没有.isInInfiniteLoop()方法。
答案 1 :(得分:0)
正如@John M所说,只要它们都在同一线程中运行,以防sub()2
中存在无限循环,该操作将永远不会返回到sub()
。但是,您可以在进入循环之前在sub()2
中检测到它。通过为循环防护的每个组合分配boolean
值,并查看其值是否为false
,便可以做到这一点。或者,您可以为循环保护中涉及的每个变量创建一个truth table
,然后查看整个循环保护是否评估为false
答案 2 :(得分:0)
如果您期望sub()
在一定时间内完成工作,除非它进入无限循环,否则您可以使用Timer
或sub()
中的某些代码来比较当前时间到开始时间,如果时间过多,则停止sub()
。
答案 3 :(得分:0)
希望会有所帮助。
只需将条件放入您放入sub()的所有循环中即可。
让我给你举个例子:
int i=0;
public void Sub(){
//loop1
while(true){
...
...
if(i>1000){
i=0;
throw new Excepion();
}
}
//loop2;
//loop3;
}
这里您可以根据需要添加限制 1000 。
答案 4 :(得分:-1)
检测无限循环的最简单方法是将println语句(可以是任何内容)放入您的方法中。如果循环是无限的,则println语句将重复打印。
如果使方法sub2()打印此语句,则可以使用sub2()检测sub()中的无限循环。
答案 5 :(得分:-1)
出于调试目的,您可以在每次调用该函数时实现一个计数器并递增。如果计数器达到某个阈值,则可以退出,调用另一个函数,在控制台上打印内容等。