尝试无限循环方法



我只是好奇为什么我不能无限循环我的方法,当我尝试这个"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...

最新更新