Почему переменные не могут быть объявлены в операторе переключения?

Я тоже столкнулся с этим.

Я думаю, что ключ к этому находится в журналах, т.е.

. Вызвано: java.lang.IllegalArgumentException: / tmp / zookeeper / data / myid файл отсутствует в org.apache.zookeeper.server.quorum.QuorumPeerConfig.parseProperties (QuorumPeerConfig.java:408)

blockquote>

Следующие строки в вашем файле zookeeper.properties предоставляют подробную информацию о ансамбль zookeeper:

server.1=0.0.0.0:2888:3888
server.2=150.20.11.134:2888:3888
server.3=150.20.11.137:2888:3888

Когда запускается один из серверов zookeeper, он знает, какой это сервер, посмотрев файл myid в его собственном каталоге данных, который в этом случае будет /tmp/zookeeper/data .

Итак, все, что вам нужно сделать, это просто создать файл с именем myid в вышеупомянутом каталоге каждого сервера и написать просто x = 1, 2 или 3 (они соответствуют серверу . x в файле zookeeper.properties).

Ссылка - Apache Zookeeper .

Надеюсь, это поможет!

8
задан Community 23 May 2017 в 11:49
поделиться

2 ответа

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

Например:

class A
{
  // has some non-trivial constructor and destructor
};

switch (x)
{
  case 1:
    A a;
    break;
  default:
    // do something else
}

Если код совершил нападки default, затем a не был бы инициализирован. Компилятор, должно быть, смог понять это заранее. Вероятно, по причинам производительности, это было запрещено.

Простая фиксация должна представить новый слой объема:

class A
{
  // has some non-trivial constructor and destructor
};

switch (x)
{
  case 1:
    {
      A a;
    }
    break;
  default:
    // do something else
}

Это делает его хорошо, разрушение a теперь четко определено.

20
ответ дан 5 December 2019 в 05:57
поделиться

Существует конфликт здесь между синтаксисом языка и здравым смыслом. Для нас люди похоже, что этот код (взятый с 1800 ответ ИНФОРМАЦИИ) должен хорошо работать:

class A
{
  // has some non-trivial constructor and destructor
};

switch (x)
{
  case 1:
    A a;
    break;
  default:
    // do something else
}

В конце концов, фигурные скобки определяют объем для a; это только создается, если мы вводим случай 1, это сразу уничтожается после отъезда случая 1 блок, и это никогда не будет использоваться, если мы не введем случай 1. На самом деле маркировки случая и инструкция по повреждению не разделяют объемы, таким образом, существование во всем блоке впоследствии, даже при том, что это логически недостижимо. И уверенный, нет такой вещи как случай 1 блока с синтаксической точки зрения.

При размышлении об операторе переключения как о наборе (структурированных) goto скрытых инструкций проблема объема становится более очевидной:

{
  if (x == 1)
    goto 1;
  else
    goto default;

  1:
    A a;
    goto end;

  default:
    // do something else

  end:
}
8
ответ дан 5 December 2019 в 05:57
поделиться