我有这段代码:
public static void Detect (String[] args) throws Exception {
PointerInfo pointer; /* needed for getting cursor location */
pointer = MouseInfo.getPointerInfo();
Point coord = pointer.getLocation();
Robot cursor = new Robot(); /*Creates a new robot */
cursor.delay(500); /* robot delay */
/**
* detection method
* Works by looking at pixel color underneath mouse.
* If RED is over > a value and GREEN is under < a value then loop
* If criteria is not matched go to Something
*/
while(true) {
coord = MouseInfo.getPointerInfo().getLocation();
Color color = cursor.getPixelColor((int)coord.getX(), (int)coord.getY());
if(color.getRed() >= 75 && color.getGreen() < 100 ){
Detect(args);
}
else{
System.out.println(color);
Something(args);
}
cursor.delay(1000);
}
}
我知道这可能是最糟糕的实施。调用void来创建循环会导致堆栈溢出。有人可以解释一下我如何让整个代码段做同样的事情,但循环使用&#34;而&#34;?
这是stacktrace btw:
Exception in thread "main" java.lang.StackOverflowError
at sun.awt.Win32GraphicsConfig.getBounds(Native Method)
at sun.awt.Win32GraphicsConfig.getBounds(Unknown Source)
at java.awt.MouseInfo.areScreenDevicesIndependent(Unknown Source)
at java.awt.MouseInfo.getPointerInfo(Unknown Source)
at com.meganukebmp.Main.Detect(Main.java:29)
at com.meganukebmp.Main.Detect(Main.java:45)
at com.meganukebmp.Main.Detect(Main.java:45)
at com.meganukebmp.Main.Detect(Main.java:45)
at com.meganukebmp.Main.Detect(Main.java:45)
at com.meganukebmp.Main.Detect(Main.java:45)
at com.meganukebmp.Main.Detect(Main.java:45)
at com.meganukebmp.Main.Detect(Main.java:45)
at com.meganukebmp.Main.Detect(Main.java:45)
at com.meganukebmp.Main.Detect(Main.java:45)
at com.meganukebmp.Main.Detect(Main.java:45)
答案 0 :(得分:1)
如果
if(color.getRed() >= 75 && color.getGreen() < 100 )
已满,您无限调用Detect
方法。
我建议您检查RGB
值并更正测试是否始终返回true
。
来源:Recursion
递归案例的工作可以看作是复杂的分解 输入更简单的。在设计合理的递归函数中, 对于每次递归调用,必须简化输入问题 最终必须达到基本情况的方式。 (功能 不打算在正常情况下终止 - 例如, 一些系统和服务器进程 - 这是一个例外。)忽略 写一个基础案例,或者对它进行不正确的测试,可能会导致 无限循环。
答案 1 :(得分:0)
刚刚删除了Detect(args); 虽然循环总是会返回true,所以不需要循环整个void。