2014-03-13 112 views
2

我想弄清楚如何編寫這個方法來避免在異常中遞歸調用方法的堆棧堆積?如何避免堆積累?

這裏是我的指示措辭:

閱讀了許多,使用異常處理程序,以確保它是一個int數量,然後添加到ArrayList對象,aryList。

這裏是我的嘗試:

public void createOriginalAryList() { 

     Scanner keyboard = new Scanner(System.in); 

     System.out.println("Enter a number: "); 

     try { 

     int number = keyboard.nextInt(); 
     aryList.add(number); 

     while(keyboard.hasNextInt()) { 

      System.out.println("Enter a number: "); 
      number = keyboard.nextInt(); 
      aryList.add(number); 

     } 

     } catch(InputMismatchException ime) { 
     System.out.println("Invalid number submitted! Try again."); 
     createOriginalAryList(); 
     } 

     System.out.println(aryList); 
    } 

任何建議都非常感謝!

+3

不要將遞歸用於非遞歸問題。它不是循環的替代品。 – EJP

+0

偉大的建議!謝謝@EJP –

回答

2

只需使用一個do-while循環:

Scanner keyboard = new Scanner(System.in); 

boolean redo = false; 
do { 
    System.out.println("Enter a number: "); 
    redo = false; 
    try { 
     int number = keyboard.nextInt(); 
     aryList.add(number); 

     while(keyboard.hasNextInt()) { 

      System.out.println("Enter a number: "); 
      number = keyboard.nextInt(); 
      aryList.add(number); 

     } 

    } catch(InputMismatchException ime) { 
     redo = true; 
     System.out.println("Invalid number submitted! Try again."); 
    } 
} 
while(redo); 
System.out.println(aryList); 

由於初始化Scanner keyboard每次是沒用的,它是在循環之前放。

+0

這個答案是現場使用循環,以避免不必要的推動到堆棧 – Ospho

+0

我知道我需要使用一個做,但只是不能在我的腦海裏看到如何正確實現它。謝謝! –

+0

如果循環後沒有最後的聲明。一個智能的Java編譯器可以檢測尾遞歸,甚至可以刪除堆棧。自動。儘管甚至有編譯器將自己所介紹的方法轉化爲循環。 –