【问题标题】:How to avoid stack build up?如何避免堆栈堆积?
【发布时间】:2014-04-17 13:11:09
【问题描述】:

我正在尝试弄清楚如何编写此方法以避免堆栈堆积在异常中递归调用该方法?

这是我的指示的措辞:

读取一个数字,使用异常处理程序确保它是一个 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);
   }

非常感谢任何建议!

【问题讨论】:

  • 不要对非递归问题使用递归。它不是循环的替代品。
  • 好建议!谢谢@EJP

标签: java recursion stack callstack code-organization


【解决方案1】:

只需使用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都没用,所以放在循环之前。

【讨论】:

  • 这个答案是正确的——使用循环来避免不必要的压栈
  • 我知道我需要使用 do while 但只是无法在我的脑海中看到如何正确实施它。谢谢!
  • 如果循环后没有最终语句。一个智能的 Java 编译器可以检测尾递归,甚至删除堆栈。自动地。尽管甚至有编译器自己将此处介绍的方法转换为循环。
  • 知道为什么第一次运行让我在输入while(keyboard.hasNextInt())之前输入两个数字吗?
  • 如果至少需要一个参数,则在进入第二个while 循环之前以及循环结束时打印System.out....。如果不需要,请在进入第二个 while 循环之前删除所有要求数据的行。
猜你喜欢
  • 2010-11-30
  • 2012-09-23
  • 2010-12-04
  • 2020-03-08
  • 2011-09-21
  • 2014-04-13
  • 2015-08-20
  • 2011-11-23
  • 1970-01-01
相关资源
最近更新 更多