java - 如何在仍然具有连续循环的情况下避免堆栈溢出?

标签 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();
    }

}

最佳答案

您似乎正在创建 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());
        }
    }
}

关于java - 如何在仍然具有连续循环的情况下避免堆栈溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20135461/

相关文章:

spring - 如何确保解析期间的异常导致与验证失败返回的(自定义)响应相同类型的响应?

c++ - 终止带有许多自定义错误消息的C++程序的最佳实践

java - jpanel不绘制缓冲图像,但缓冲图像可以创建为文件

java - 使用 SimpleDateFormat,Java 的日期解析不正确

java - 本地主机上的服务器 tomcat v8.0 服务器无法启动

c# - C# 如何用从一个文本框中输入的值填充数组

bash - 当后台作业失败时停止 linux bash 脚本

java - 使用 SWT 在 Java 中呈现 SVG - Batik 太慢

java - 如何检查鼠标是否被压出 JFrame

input - 如何从字符串中提取两个整数?