Сколько раз этот цикл будет читать входной поток? - PullRequest
0 голосов
/ 15 марта 2012

У меня есть блок без комментариев, который я пытаюсь понять.Комментарии мои.

//create an array name header that holds 4 bytes
byte header[] = new byte[4];
int len = 0;
int c = -1;

for(; len != 3; len += c)// run loop till len = 3
{
  try
  {
    //first run of the loop following should be true
    //read 3 bytes and save into header array starting at 0
    // c = number of bytes read (most likely 3 after first run of loop)

    c = is.read(header, len, 3 - len);

  }
  catch(Exception e)
  {
     System.err.println("read header error " + e.getMessage());
     displayErrorMessage(e);
  }
  if(c == -1)
    return null;

}

Этот код читает поток ввода, но я не уверен, сколько раз он будет зацикливаться.Я попытался выполнить цикл на бумаге, заменяя len и c каждый раз, и после 7 итераций len по-прежнему не равнялся 3.

Во время второго запуска цикла len должно равняться -1 и cдолжно равняться 3. Значение -1 должно заставить метод read генерировать IndexOutOfBoundsException, потому что вы пытаетесь сохранить прочитанный байт из потока в заголовок [-1].Таким образом, поскольку генерируется исключение, значение c останется равным 3 с первого запуска цикла.

Прав ли я, полагая, что поскольку исключение перехвачено, цикл for не завершается?

1 Ответ

3 голосов
/ 15 марта 2012

Количество повторений цикла не является детерминированным, поскольку read() может прочитать 3 байта при первом запуске и завершиться - или может прочитать 1 байт за раз и повториться 3 раза.

Однако, как говорится в комментарии, весьма вероятно, что read() прочитает во время первой итерации 3 байта, и цикл будет иметь только одну итерацию.
Для этого случая произойдет следующее:

  1. проверить, если len < 3 - это
  2. прочитать 3 байта в массив и установить c = 3
  3. проверить, если c == -1 - это не
  4. конец цикла: набор len = len + c = 3
  5. проверить, если len < 3 - это не так: завершить цикл
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...