2015-10-19 171 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。