如何在保持连续循环的同时避免堆栈溢出?

时间:2013-11-22 01:45:34

标签: java input error-handling stack-overflow

我有一个简单的程序(底部的代码),它读取用户输入,然后将其吐出。我知道我的问题可能有其他解决方案,但我想使用这样的东西,因为它在将来的程序中会很有用。我遇到了堆栈溢出问题。我已经读过这个话题了:

- What is a StackOverflowError? -

我已经阅读了前几个答案,但问题是我想要一个连续循环,因为它是程序的目的。我想知道是否有任何方法可以清除我的“堆栈”,以便我可以继续循环。我完成每次运行后都不需要保留任何数据,如果有帮助的话。

如果我改变第15行:

,它可以正常工作
for(int y=0;y<System.in.available();++y)

到:

for(int y=0;y<10;++y)

但这样做会严重限制它可以读取的字符数量,我不希望如此。而且,如果可能的话,我宁愿继续使用(char)System.in.read()方法来获取输入。

我的程序如下:

package main;

import java.io.IOException;

public class Root 
{   
    public static void main(String[] args)
    {
        new Root();
    }

    public Root()
    {
        try{
            for(int y=0;y<System.in.available();++y)
            {
                try 
                {
                    System.out.print((char)System.in.read());
                } 
                catch (IOException exep)
                {
                    System.out.print(exep.getLocalizedMessage());
                }
            }
        }
        catch(IOException exep)
        {
            System.out.println(exep.getLocalizedMessage());
        }
        new Root();
    }

}

1 个答案:

答案 0 :(得分:1)

您似乎正在创建Root对象,但并未真正使用它们。对于每次可用字符的运行,无限递归将继续在堆栈上推送堆栈帧,最终导致堆栈溢出异常 - Java不进行尾调用优化(TCO)。

为什么不将Root构造函数更改为:

public Root()
{
    while (true) {
        try{
            for(int y=0;y<System.in.available();++y)
            {
                try 
                {
                    System.out.print((char)System.in.read());
                } 
                catch (IOException exep)
                {
                    System.out.print(exep.getLocalizedMessage());
                }
            }
        }
        catch(IOException exep)
        {
            System.out.println(exep.getLocalizedMessage());
        }
    }
}