2016-07-03 2 views
-1

をしようと、それは動作しますが、私は私のオブジェクト走る「カウンター」であることをすればメソッド "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"); 
    } 
    } 
} 

私のメインクラスですこれは私の追加のカウンタークラスです

+0

'StackOverflow'エラーが発生しましたか? –

+2

@ ElSadoffあなたはStackoverflowを意味しますか? – Li357

+0

私は例えば9000に私の最大数を設定すると、 "Counter.function(Counter.java:36)で"多くの行を取得する – zapole

答えて

-1

あなたが投稿したコードがループではない、それはrecursive関数呼び出しです。

ブラックボックスとしてCounter.function()を考えると便利かもしれません。それが呼び出されると、プログラムの実行はブラックボックスに入り、関数が終了するまで(つまり、それが戻るまで)、その外側には戻りません。

ですから、function()を呼んで初めて、あなたは1つのブラックボックスに入力しています。そして、あなたは新しいブラックボックスを入力、自体内から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; 
} 

これにより、次の関数呼び出しを開始する前に1つの関数呼び出しを終了することができます。または、ブラックボックスの類推を続けるには、次のようになります。

Executing function() 
return; 
Executing function() 
return; 
Executing function() 
return; 
...etc... 
+0

うわー、これは本当に役に立ちました、今私は最終的にそれがどのように動作するか理解しています!、本当にありがとうございました:) – zapole

+0

何とか遅く計算することができますか? – zapole

0

JavaはDinamically囲みスコープの活性化レコード(AR)を保存するのであなたは無限に、あなたのループを実行するカント(DES)スタックには、スタックは無限にスペースを持っていません。

ので、順番に、あなたが持っているすべてのメモリ空間を使用することを避けるために、JavaはStackOverflowのエラーがスローされます。

+0

ありがとう!、私はそれを知らなかった、今私はインターネットで(AR)と(DES)を読むつもりです、本当にありがとう!:) – zapole

関連する問題