我只是好奇为什么我不能无限循环我的方法,当我尝试这个"while(true)"然后它工作,但如果我这样做与我的对象"Counter"运行方法"function()"无限然后它只工作到6200,有时它改变最大值为~6100或~6300,有人知道为什么它这样工作,也许如何?
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);
}
}
}
这是我的Main类
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");
}
}
}
这是我的额外的计数器类
你不能无限地运行你的循环,因为Java将动态封闭作用域(DES)的激活记录(AR)保存在堆栈中,但是堆栈没有无限的空间。
因此,为了避免使用所有的内存空间,Java抛出StackOverflow错误。
你发布的代码不是一个循环,它是一个递归函数调用。
把Counter.function()
想象成一个黑盒可能会有帮助。当它被调用时,程序执行进入黑盒,直到函数完成(即当它返回时)才返回黑盒。
所以你第一次调用function()
,你进入了一个黑盒。然后你再次调用function()
从它的内部,进入一个新的黑盒。但这里有个问题——你还没有走出第一个黑匣子!所以你会得到这样的结果:
Executing function()
Executing function()
Executing function()
...etc...
return;
return;
return;
问题是,对于每个进入的黑盒,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( function() )
;
或:
while(true){
if( !function() )
break;
}
这允许在开始下一个函数调用之前完成一个函数调用。或者,继续黑盒的类比,它看起来更像这样:
Executing function()
return;
Executing function()
return;
Executing function()
return;
...etc...