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