«Возврат» останавливает выполнение метода? - PullRequest
10 голосов
/ 07 сентября 2011

Я запрограммировал метод следующим образом:

if (something) {
   return 1;
}
the rest of the code

Мне кажется, что метод возвращает 1 и затем выполняет the rest of the code.Может ли это быть правдой?Не return останавливает выполнение кода.Если это не так, как я могу принудительно остановить метод?

ДОБАВЛЕНО

Вот код (согласно запросу):

    for (int i=availableTime; i>0; i=i-1) {
            final int sec = i;
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    String lbl = "<html>";
                    lbl += "</html>";
                    timeLeftLabel.setText(lbl);
            }
            });
            try {Thread.sleep(1000);} catch (InterruptedException e) {}
            parameterFromClientsListener = clientsListener.getValue(userName,parameterToGet);
            if (!parameterFromClientsListener.equals("null")) {
                output = parameterFromClientsListener;
                game.log.fine(userName + " set (by button) " + parameterToGet + " to be equal to " + output + " . [IMPORTANT]");
                return output;
            }
    }

    game.log.fine("The partner selection phase is expired.");
    // This code is executed if the Submit button was not pressed and the time run out.
    if (parameterToGet.equals("partner")) {
        tellMyChoice(parameterToGet, this.partnerFromForm, "timer of" + field);
        output = this.partnerFromForm;
    }
    game.log.fine(parameterToGet + " was submitted by timer (not by OK button).");
    } else {
    output = parameterFromClientsListener;
    }
    game.log.fine(userName + " set (by timer)" + parameterToGet + " to be equal to " + output + " . [IMPORTANT]");
    return output;
}

Я запускаю этот код два раза.В каждом случае я генерирую лог-файл.В обоих лог-файлах я вижу оператор "set (by button)" (прямо перед return).Но проблема в том, что во втором файле журнала я вижу выражение «timer of».Которая не должна быть достигнута, если достигнута «установка (кнопкой)».Как это может быть?Я должен упомянуть, что «set (by button)» и «timer of» больше не встречаются в моем коде (они встречаются только один раз).

ADDED 3

Как видно из кода, у меня нет оператора finally.

Ответы [ 6 ]

13 голосов
/ 07 сентября 2011

Это не так, оператор return остановит любой следующий код. (Единственное исключение - оператор return находится в блоке try {}, который впоследствии имеет блок finally {}.

    if(0==0){
       return;
    }
    System.out.println("This will not print.");
10 голосов
/ 07 сентября 2011

return завершает выполнение метода.Есть одно исключение: блок finally.В следующем случае 2 будет возвращено

public int foo() {
  try {
    return 1;
  } finally {
    return 2;
  }
}
0 голосов
/ 09 сентября 2011

Я хотел понять, как наблюдаемое поведение может быть возможным. Более подробно я увидел «парадоксальное» поведение. В моих файлах журнала я видел вывод строки, которая происходит до return, а также вывод, полученный кодом после возврата. Итак, я предположил, что return не останавливает выполнение программы. Как правильно было сказано здесь другими «ответчиками», это предположение неверно. Объяснение поведения тривиально. Моя программа запускает показанный код несколько раз. Первый раз, когда он достигает оператора return, второй раз, когда он проходит его (потому что return находится в операторе if). Вот почему у IO есть оба оператора в файле журнала.

0 голосов
/ 07 сентября 2011

Вы пишете

if (!parameterFromClientsListener.equals("null")) {
    output = parameterFromClientsListener;
    game.log.fine(userName + " set (by button) " + parameterToGet + " to be equal to " + output + " . [IMPORTANT]");
    return output;
}

Вы сравниваете строку (или что-то еще) со строкой "null" и возвращаете, если они отличаются. Вы действительно хотите сделать это, а не parameterFromClientsListener != null?

(Хотя это не должно быть большой разницей, поскольку parameterFromClientsListener не является ни null, ни "null", а если оно null, ваша версия выдаст исключение NullPointerException.)

Вы действительно получаете запись в своем лог-файле? Если это так, вы также должны получить возврат.

0 голосов
/ 07 сентября 2011

Возвращает ли останавливает выполнение кода

ну, почти.

Как только возвращение встречается, выполнение метода останавливается, и управление передаетсяк вызывающему методу после выполнения каких-либо предложений finally .

int add(int a, int b)
{
   try{
      if(a == 0)
      {
         return b;
      }

      if(b == 0)
      {
         return a;
      }

      return a+b;
   }
   finally
   {
      System.out.println("Finally");
   }
}

В приведенном выше коде функция вызывается как add (0, 1), "И наконец" все равнонапечатано.

Как я могу заставить метод остановиться?

ИЛИ Каковы другие способы выхода из метода?

Исключения

0 голосов
/ 07 сентября 2011

Return действительно завершает выполнение метода.Проверьте ваши другие предположения.Возможно, что-то в других частях кода не работает, как вы предполагаете.

...