我有一个简单的程序(代码在底部),它读取用户输入然后将其吐出。我知道我的问题可能还有其他解决方案,但我想使用这样的方法,因为它在将来的程序中很有用。我遇到了堆栈溢出问题。我已经读过这个主题:
-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/