2015-10-19 162 views
0

我有这样的代码:循环代码导致堆栈溢出

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) 
+0

向我们展示stacktrace! –

+0

@ArshadAli补充说。 – meganukebmp

+0

你可以用你收到的相同参数调用'Detect(args)'。显然这会造成无限循环。你必须用不同的参数来调用它(即创建一个参数副本,然后修改/减少该副本)。 – hoijui

回答

1

如果

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

是fullfilled,你是无限调用Detect方法。

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

来源:Recursion

的递归案件的工作可以看作是打破复杂 输入成简单的。在一个设计合理的递归函数中,每次递归调用都需要简化 ,这样最终必须达到基本情况。 ( 在一般情况下不打算终止的功能(例如,某些系统和服务器进程为 )是例外情况。)忽略 写入基本情况或对其进行错误测试可能导致无限循环 。

+0

我知道这是造成它。我正在寻求一种解决方法。要么改变我循环的方式。或者是其他东西。 – meganukebmp

+0

@meganukebmp我认为这很清楚。你的测试必须是错误的。你知道你得到了哪种颜色,看看它们的RGB值,并检查你的测试是否合理。 –

+0

我很抱歉,但我似乎不明白。我在语言方面很新颖。我必须返回true如果我想重复while循环,并在我想退出它时返回false。是对的吗? @YassinHajaj – meganukebmp

0

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