循环代码导致堆栈溢出

时间:2015-10-19 08:14:11

标签: java loops while-loop stack-overflow

我有这段代码:

 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)

2 个答案:

答案 0 :(得分:1)

如果

if(color.getRed() >= 75 && color.getGreen() < 100 )

已满,您无限调用Detect方法。

我建议您检查RGB值并更正测试是否始终返回true

来源:Recursion

  

递归案例的工作可以看作是复杂的分解   输入更简单的。在设计合理的递归函数中,   对于每次递归调用,必须简化输入问题   最终必须达到基本情况的方式。 (功能   不打算在正常情况下终止 - 例如,   一些系统和服务器进程 - 这是一个例外。)忽略   写一个基础案例,或者对它进行不正确的测试,可能会导致   无限循环。

答案 1 :(得分:0)

刚刚删除了Detect(args); 虽然循环总是会返回true,所以不需要循环整个void。