检测方法内部的无限循环

时间:2018-10-11 15:05:31

标签: java reflection infinite-loop core

我的主班有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()中的反射来加载一个类,然后在那儿执行它..

6 个答案:

答案 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()在一定时间内完成工作,除非它进入无限循环,否则您可以使用Timersub()中的某些代码来比较当前时间到开始时间,如果时间过多,则停止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)

出于调试目的,您可以在每次调用该函数时实现一个计数器并递增。如果计数器达到某个阈值,则可以退出,调用另一个函数,在控制台上打印内容等。