Java 尝试无限循环方法
我只是好奇,为什么我不能无限循环我的方法,当我尝试使用“while(true)”时,它会工作,但如果我使用运行方法“function()”的对象“Counter”无限循环,那么它只能工作到6200,有时它会将最大值更改为~6100或~6300,有人知道它为什么会这样工作,或者如何工作吗Java 尝试无限循环方法,java,infinite-loop,Java,Infinite Loop,我只是好奇,为什么我不能无限循环我的方法,当我尝试使用“while(true)”时,它会工作,但如果我使用运行方法“function()”的对象“Counter”无限循环,那么它只能工作到6200,有时它会将最大值更改为~6100或~6300,有人知道它为什么会这样工作,或者如何工作吗 public class Infinity { public static void main(String[] argv) { //Counter count = new Counter((s
public class Infinity {
public static void main(String[] argv)
{
//Counter count = new Counter((short)0,(short)6180,(short)1);
//count.startCounter(true);
int a = 1;
while (true) {
a = a + 1;
System.out.println("Value: " + a);
}
}
}
这是我的主课
public class Counter
{
private short max;
private short number;
private short multiplicator;
public Counter(short n,short m,short mp)
{
System.out.println("Implementing given numbers...");
this.number=n;
this.max=m;
this.multiplicator=mp;
System.out.println("");
}
public void startCounter(boolean b)
{
if (b == true)
{
System.out.println("-----------------------------------");
System.out.println("Starting counting from " + this.number + " to " + this.max);
System.out.println("-----------------------------------");
this.function();
}
else {
System.out.println("Your Counter was set to false, abborting Start...");
}
}
public void function()
{
if (this.number < this.max)
{
this.number = (short)(this.number + this.multiplicator);
System.out.println("Number: " + this.number);
this.function();
}
else {
System.out.println("Ending of Number");
}
}
}
公共类计数器
{
私人短最大值;
私人短号码;
专用短乘法器;
公共计数器(短n、短m、短mp)
{
System.out.println(“实现给定的数字…”);
这个数字=n;
这个。max=m;
这个乘法器=mp;
System.out.println(“”);
}
公共无效起始计数器(布尔b)
{
如果(b==true)
{
System.out.println(“-----------------------------------------”;
System.out.println(“从“+this.number+”开始计数到“+this.max”);
System.out.println(“-----------------------------------------”;
这个函数是()的;
}
否则{
System.out.println(“您的计数器设置为false,缩写为Start…”);
}
}
公共空间功能()
{
if(this.number
这是我的附加计数器类您不能无限地运行循环,因为Java在堆栈中保存了动态封闭作用域(DES)的激活记录(AR),但堆栈没有无限的空间
因此,为了避免使用所有的内存空间,Java抛出StackOverflow错误。您发布的代码不是循环,而是函数调用 将
Counter.function()
看作一个黑盒子可能会有所帮助。调用时,程序执行进入黑盒,直到函数完成(即返回时)才返回到黑盒外部
因此,第一次调用function()
,您输入的是一个黑框。然后再次从函数本身调用function()
,输入一个新的黑框。但这里有一个陷阱-你还没有退出第一个黑匣子!所以你会得到这样的结果:
Executing function()
Executing function()
Executing function()
...etc...
return;
return;
return;
while( function() )
;
Executing function()
return;
Executing function()
return;
Executing function()
return;
...etc...
问题是,对于输入的每个黑盒,Java都需要分配内存,并且在函数(黑盒)执行完毕之前,内存无法释放。因此,您最终会耗尽内存
您应该做的是,正如您在问题中建议的那样,使用循环:
public bool function() {
if (this.number < this.max) {
this.number = (short)(this.number + this.multiplicator);
System.out.println("Number: " + this.number);
} else {
System.out.println("Ending of Number");
}
return (this.number < this.max);
}
或者这个:
while(true){
if( !function() )
break;
}
这允许在开始下一个函数调用之前完成一个函数调用。或者,继续类比黑匣子,它看起来更像这样:
Executing function()
Executing function()
Executing function()
...etc...
return;
return;
return;
while( function() )
;
Executing function()
return;
Executing function()
return;
Executing function()
return;
...etc...
您是否遇到了一个
StackOverflow
错误?@EliSadoff您的意思是StackOverflow?例如,当我将我的max number设置为9000时,我得到了许多行“at Counter.function(Counter.java:36)”@AndrewL。这也是当您过度使用递归时得到的结果。它溢出了你的堆栈。我知道,这是一个StackOverflower错误,StackOverflow是网站名@EliSadoff只是一个品牌名称!,我不知道,现在我要在互联网上阅读关于(AR)和(DES)的文章,真的非常感谢!)哇,这真的很有帮助,现在我终于明白它是如何工作的了!,真的谢谢你:)我能不能让它慢一点?