2016-07-03 4 views
-1

Мне просто интересно, почему я не могу бесконечно зацикливать свой метод, когда я пытаюсь это с помощью «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"); 
    } 
    } 
} 

Это мой дополнительный счетчик класса

+0

Вы получаете ошибку 'StackOverflow'? –

+2

@EliSadoff вы имеете в виду Stackoverflow? – Li357

+0

Когда я устанавливаю максимальное число, например, 9000, я получаю много строк «на Counter.function (Counter.java:36)» – zapole

ответ

-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... 
+0

Вау, это было действительно полезно, теперь я наконец понял, как это работает !, действительно спасибо вам за это :) – zapole

+0

Могу ли я как-то заставить его вычислять медленнее? – zapole

0

вы не можете бесконечно запустить цикл, потому что Java сохраняет активации записи (AR) из области видимости Динамично (DES) в стеке, но стек не имеет бесконечного пространства.

Итак, чтобы избежать использования всего пространства памяти, которое у вас есть, Java вызывает ошибку StackOverflow.

+0

Спасибо !, Я этого не знал, теперь я буду читать о (AR) и (DES) в Интернете, действительно спасибо!:) – zapole

Смежные вопросы