У меня есть случай переключения в цикле 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. Пожалуйста, помогите. Заранее спасибо.
Как именно вы определили, какой именно оператор break вызывает завершение цикла? Что делает вас уверенным, что это не условие while или ответная ветвь null? Вы можете добавить несколько предложений, объясняющих это?
Почему бы не использовать условия if-elseif-else вместо switch?
@Kostiantyn Я наблюдал за журналом, и он выпадает из цикла, когда завершается break после notifyAll.
Вместо break в MY_LABEL вы можете использовать continue. Как сказано в ключевом слове, он пропустит текущую итерацию цикла и Продолжить со следующей итерацией цикла.
@Kostiantyn, вы были правы, на самом деле цикл не прерывался из-за оператора break, но виновником было необработанное исключение сокета. Я закрывал сокет перед его повторным чтением, что вызывало исключение сокета.




Подумайте о этикетке для вашего 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, а не с лейблом, о котором вы говорите.
Попробуйте добавить метку для переключателя. Просто добавьте
MY_LABEL:выше переключателя и используйтеbreak MY_LABELвместоbreak. Пожалуйста, дайте мне знать результат.