Рассматриваемая проблема действительно может быть решена с помощью предложений других народов. В дополнение к быстрому исправлению, я хотел бы дать некоторую интуицию о , почему вы получаете ошибки:
Компилятор, т.е. программа, которая (упрощенно) выходит из вашего Java code -> Java byte code (сокращенная версия написанного вами) -> Машинный код (0 и 1) должен обеспечивать соблюдение определенных правил. Поскольку Java - это объектно-ориентированный язык программирования высокого уровня, он скрывает от вас много деталей. Например, вам никогда не придется беспокоиться о , где в памяти что-то хранится, вы будете предупреждены, как только вы go выйдете за пределы массива, и после использования объекта вы никогда Нужно избавиться от него вручную (т.е. освободить занимаемое им пространство).
Звучит отлично, верно? Ну, проблема в том, что Java, выполняя это, должно проверять вещи, которыми должен управлять программист на других языках программирования (например, C). Хотя вы можете знать, что определенный путь через ваши операторы if никогда не будет принят, компилятор не может быть на 100% уверен в предоставленном вами коде. Давайте посмотрим на следующий пример:
int lel;
boolean test = true;
if(test)
{
lel = 10;
}
System.out.println(lel);
Даже этот упрощенный c отрубленный код скинет компилятор. Основная проблема того, что я описал выше, на самом деле более техническая, а именно в том случае, когда переменные оцениваются не в время компиляции , а в время выполнения . В двух словах, компилятор рассматривает lel
и test
как черный ящик, содержащий значение типа. Какие значения они содержат, не имеет значения при компиляции.
Следовательно, компилятор не знает, что test
действительно всегда верно. С другой стороны, если вы напишите:
int lel;
if(true)
{
lel = 10;
}
, то компилятор, поскольку true - это не переменная, а значение, оценивает его при компиляции. Поэтому вы не получите ошибку. Последний пример - это использование ключевого слова final
. final
означает, что значение не будет изменено после его определения. Поскольку это в основном равносильно тому, что переменная является постоянной, компилятор фактически «смотрит» на значение переменной и не рассматривает его как черный ящик. То есть, если вы замените boolean test = true;
на final boolean test = true;
, компилятор будет обрабатывать test
как значение. Следовательно, во время компиляции уже ясно, что оператор if всегда оценивается как true.
В любом из двух примеров (т. Е. if (true){...}
и final boolean test = true;
, компилятор наверняка поймет, что если утверждение вокруг lel = 10;
бесполезно и переписать его так:
int lel;
lel = 10;