【问题标题】:Looping code causes stack overflow循环代码导致堆栈溢出
【发布时间】:2015-10-19 08:14:10
【问题描述】:

我有这个代码:

 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 创建循环会导致堆栈溢出。有人能解释一下我如何让整个代码段做同样的事情,但使用“while”循环吗?

顺便说一句,这里是堆栈跟踪:

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)

【问题讨论】:

  • 请给我们看stacktrace!
  • 您调用Detect(args) 时使用的参数与您收到的相同。显然这将创建一个无限循环。您必须使用不同的参数调用它(即创建参数的副本,然后修改/减少该副本)。

标签: java loops while-loop stack-overflow


【解决方案1】:

如果

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

已满,你在无限调用Detect方法。

我建议您检查您的 RGB 值并更正测试,如果它总是返回 true

来源:Recursion

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

【讨论】:

  • 我知道这是导致它的原因。我正在寻求一种解决方法。要么改变我循环的方式。或者别的什么。
  • @meganukebmp 我认为这很清楚。你的测试一定是假的。您知道自己得到的是哪种颜色,因此请查看它们的 RGB 值并检查您的测试是否合理。
  • 我很抱歉,但我似乎不明白。我对语言很陌生。如果我想重复while循环并在我想退出它时返回false,我必须返回true。是对的吗? @YassinHajaj
  • 是的,我的测试是合理的,如果我得到的颜色符合我设置的值,它会调用其他的Something void。问题是,Something void 完成其工作后,它再次调用 Detect void 并因此循环它。如果您想查看完整代码,请告诉我。
【解决方案2】:

刚刚删除了 Detect(args); While 循环将始终返回 true,因此无需循环整个 void。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-07
    • 1970-01-01
    • 1970-01-01
    • 2015-05-21
    • 2014-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多