我只是好奇为什么我无法无限循环我的方法,当我尝试“while(true)”然后它工作,但如果我用我的对象“计数器”运行方法“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);
}
}
}
这是我的主要课程
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");
}
}
}
这是我的额外Counter类
答案 0 :(得分:0)
你无法无限地运行你的循环,因为Java在堆栈中保存了Dinamically Enclosing Scope(DES)的激活记录(AR),但堆栈没有无限空间。
因此,为了避免使用你拥有的所有内存空间,Java会抛出StackOverflow错误。
答案 1 :(得分:-1)
您发布的代码不是循环,而是recursive函数调用。
将Counter.function()
视为黑匣子可能会有所帮助。当它被调用时,程序执行进入黑盒子并且不会返回到它之外直到该功能完成(即当它返回时)。
因此,当您第一次拨打function()
时,您将进入一个黑匣子。然后,您再次从内部再次呼叫function()
,进入一个新的黑匣子。但是这里抓住了 - 你还没有退出第一个黑匣子!所以你最终得到这样的东西:
Executing function()
Executing function()
Executing function()
...etc...
return;
return;
return;
问题是,对于输入的每个黑盒子,Java需要分配内存on the stack,并且该内存不能被释放,直到功能(黑匣子)完成执行。结果,你最终会耗尽内存。
您应该做的是,正如您在问题中所建议的那样,使用循环:
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...