Java 尝试无限循环方法

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

我只是好奇,为什么我不能无限循环我的方法,当我尝试使用“while(true)”时,它会工作,但如果我使用运行方法“function()”的对象“Counter”无限循环,那么它只能工作到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");
    } 
  }
}
公共类计数器
{
私人短最大值;
私人短号码;
专用短乘法器;
公共计数器(短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)的文章,真的非常感谢!)哇,这真的很有帮助,现在我终于明白它是如何工作的了!,真的谢谢你:)我能不能让它慢一点?