Java Switch-case в цикле While с синхронизированным блоком, вызывающим разрыв цикла

У меня есть случай переключения в цикле while. В то время как в одном случае есть синхронизированный блокированный, за которым следует оператор break. Этот оператор break вызывает прерывание цикла, а не case. Ниже приведен код.

while (!shutdown && !Thread.currentThread().isInterrupted()) {
            try {
                logger.info("Trying to Read message");
                ServerResponseMessage response = gson.fromJson(jsonReader, ServerResponseMessage.class);
                logger.info("Message Reading completed.");
                if (response == null) {
                    logger.info("Received EOS Response, closing thread.");
                    break;
                }
                switch (response.getRequestType()) {
                /* GET request type is considered as the request for the new object */
                case GET:
                    object = response.getObject();
                    synchronized (requestLock) {
                        requestLock.notifyAll();
                    }
                    break;
                    /*
                     * If client receives HEARTBEAT message from Server, client need to response as
                     * Ack.
                     */
                case HEARTBEAT:
                    logger.info("Received Hearbeat");
                    ServerResponseMessage message = new ServerResponseMessage(RequestType.HEARTBEAT_ACK, null);
                    JsonWriter jsonWriter = new JsonWriter(new OutputStreamWriter(serverSocket.getOutputStream()));
                    jsonWriter.jsonValue(new Gson().toJson(message));
                    jsonWriter.flush();
                    logger.info("Sent Hearbeat Ack");
                    break;
                default:
                    break;
                }
                logger.info("Completed reading.");
            } catch (IOException e) {
                logger.warn("Error while reading client", e);
                shutdown = true;
            }
        }

В приведенном выше коде случай GET вызывает разрыв цикла, согласно журналу он напрямую выходит из цикла while после метода notifyAll. Пожалуйста, помогите. Заранее спасибо.

Попробуйте добавить метку для переключателя. Просто добавьте MY_LABEL: выше переключателя и используйте break MY_LABEL вместо break. Пожалуйста, дайте мне знать результат.

Mahdi-Malv 02.10.2018 08:16

Как именно вы определили, какой именно оператор break вызывает завершение цикла? Что делает вас уверенным, что это не условие while или ответная ветвь null? Вы можете добавить несколько предложений, объясняющих это?

Kostiantyn 02.10.2018 08:17

Почему бы не использовать условия if-elseif-else вместо switch?

Balwinder Singh 02.10.2018 08:17

@Kostiantyn Я наблюдал за журналом, и он выпадает из цикла, когда завершается break после notifyAll.

ROHIT IHARE 02.10.2018 08:23

Вместо break в MY_LABEL вы можете использовать continue. Как сказано в ключевом слове, он пропустит текущую итерацию цикла и Продолжить со следующей итерацией цикла.

LuCio 02.10.2018 08:58

@Kostiantyn, вы были правы, на самом деле цикл не прерывался из-за оператора break, но виновником было необработанное исключение сокета. Я закрывал сокет перед его повторным чтением, что вызывало исключение сокета.

ROHIT IHARE 02.10.2018 09:39
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
6
185
1

Ответы 1

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

LOOP1:
while (condition) {
   MY_LABEL:
   switch (variable) {
      case (a):
        break LOOP1; // will break the loop -> Also continue; works as well.
        break MY_LABEL; // it will break the switch and continue on loop
   }
}

Обычно это полезно для вложенных циклов. Для получения дополнительной информации см. документы.

Я думаю, что ссылка связана с JLable, а не с лейблом, о котором вы говорите.

ROHIT IHARE 02.10.2018 09:36

Другие вопросы по теме