Обнаружить бесконечный цикл внутри метода - PullRequest
0 голосов
/ 11 октября 2018

У меня есть 2 метода в моем основном классе

public class pol{

    public sub() {
         //... do this
         //... do this
         //... do this
         return result
    }

     public sub2()
         // calling method sub() here
         return result
     }

}

Есть ли способ, чтобы я мог обнаружить, что я написал бесконечный цикл в sub (), используя метод sub2 ()?

Мы можем взять сценарий, в котором я загружаю класс, используя отражение в sub (), и выполняю его там ..

Ответы [ 6 ]

0 голосов
/ 12 октября 2018

Пусть это поможет.

Просто поместите условия во все циклы, которые вы вставили в sub ().

Позвольте мне привести пример:

int i=0;
public void Sub(){
  //loop1
  while(true){
    ...
    ...
    if(i>1000){
    i=0;
    throw new Excepion();
    }
  }
  //loop2;
  //loop3; 
}

здесь вы можете добавить лимит в соответствии с вашими потребностями 1000 только для примера.

0 голосов
/ 11 октября 2018

Если есть определенное время, к которому вы ожидаете, что sub() завершит свою работу, если он не вошел в бесконечный цикл, вы можете использовать Timer или некоторый код в sub(), который сравнивает текущее время с временем запуска, иостановитесь sub(), если прошло слишком много времени.

0 голосов
/ 11 октября 2018

Как сказал @John M, пока они оба работают в одном потоке, операция никогда не вернется обратно к sub()2, если в sub() есть бесконечный цикл.Однако вы можете обнаружить его в sub()2 перед входом в цикл.Это было бы возможно, если присваивать значения boolean каждой комбинации защиты от петель и посмотреть, будет ли она когда-либо иметь значение false.Или вы можете создать truth table для каждой переменной, участвующей в защите цикла, и посмотреть, оценивается ли когда-либо защита цикла в целом как false

0 голосов
/ 11 октября 2018

В целях отладки вы можете реализовать счетчик и приращение при каждом вызове функции.Если счетчик достигает определенного порога, вы можете выйти, вызвать другую функцию, распечатать что-нибудь на консоли и т. Д.

0 голосов
/ 11 октября 2018

Пока они работают в одном потоке, нет.Операция никогда не вернется к sub2 (), если в sub () есть бесконечный цикл.

Если sub2 () раскручивает поток, который запускает цикл в sub (), это все равно может оказаться невозможным.Это может быть проблема с проблемой остановки.Sub2 () может взаимодействовать с потоком, в котором находится sub (), и уничтожать его через заданное время, заданное количество итераций или какой-либо другой критерий.Если есть какое-то состояние, которое вы знаете, чтобы проверить это, то это приведет к тому, что sub2 () может искать это состояние в бесконечном цикле и уничтожать sub (), если он входит в него, но у Thread нет метода .isInInfiniteLoop ().

0 голосов
/ 11 октября 2018

Самый простой способ обнаружить бесконечный цикл - это поместить оператор println (может быть любым) в ваш метод.Если цикл бесконечный, то оператор println будет многократно печатать.

Если вы заставите метод sub2 () напечатать этот оператор, то вы можете использовать sub2 (), чтобы обнаружить бесконечный цикл в sub ().

...