Ошибка назначения последней переменной

Я не знаю, является ли это глупым вопросом или не, но, пожалуйста, попытайтесь ответить на него.

public static void main(String[] args){
    int i=0;
    final int x;
    if(i==0){
        x=1;
        System.exit(0); 
    }
    x=2;
}

У меня есть последняя переменная x.

Теперь, чтобы назначить стоимость на x я имею, если заявление, которое назначает его и выходы программа.

Теперь последнее заявление никогда не достигается, и таким образом эта программа должна собрать логически.

у x будет стоимость 1 или 2 в зависимости от если заявление. Если, 'если' верно, последнее заявление не достигнуто и если это ложно, 'x=1' заявление никогда не достигается.

Итак, почему это дает мне, ошибка компиляции 'местной' переменной была инициализирована?

Править:

да я действительно, очевидно, знаю, что заключительное заявление может быть назначено только однажды.

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

1
проверьте комментарий, который говорит об Определенном Назначении на Яве
добавлено автор Rupesh, источник

9 ответы

Final is Final 

как только вы объявили и назначили, Вы не можете назначить его снова.

И заключительное назначение - проверка времени компиляции. Даже вы выходите из функции прежде все еще, она сделает свою обязанность:).

2
добавлено
x=2; действительно ли оператор присваивания правильный?? Возможность здесь еще, добавляют условие и назначают там.
добавлено автор ꜱᴜʀᴇꜱʜ ᴀᴛᴛᴀ, источник
@LuigiEdlCarno точно ответ я искал.Thank you.
добавлено автор drarkayl, источник
но только одно из тех заявлений достигнуто, когда выполнение происходит
добавлено автор drarkayl, источник
да, но я действительно не повторно назначаю его. это назначено только однажды в ходе программы.
добавлено автор drarkayl, источник
Corrent @drarkayl, "..., когда выполнение происходит" , но это - ошибка времени компиляции, и начиная с вашего System.exit (0); называют doesn' у t есть возвращение после, компилятор предполагает, что назначение после, если будет выполнен также.
добавлено автор LuigiEdlCarno, источник
Final is Final 

как только вы объявили и назначили, Вы не можете назначить его снова.

И заключительное назначение - проверка времени компиляции. Даже вы выходите из функции прежде все еще, она сделает свою обязанность:).

2
добавлено
x=2; действительно ли оператор присваивания правильный?? Возможность здесь еще, добавляют условие и назначают там.
добавлено автор ꜱᴜʀᴇꜱʜ ᴀᴛᴛᴀ, источник
@LuigiEdlCarno точно ответ я искал.Thank you.
добавлено автор drarkayl, источник
но только одно из тех заявлений достигнуто, когда выполнение происходит
добавлено автор drarkayl, источник
да, но я действительно не повторно назначаю его. это назначено только однажды в ходе программы.
добавлено автор drarkayl, источник
Corrent @drarkayl, "..., когда выполнение происходит" , но это - ошибка времени компиляции, и начиная с вашего System.exit (0); называют doesn' у t есть возвращение после, компилятор предполагает, что назначение после, если будет выполнен также.
добавлено автор LuigiEdlCarno, источник

у x будет стоимость 1 или 2 в зависимости от если заявление. Если, 'если' верный последнее заявление не достигнуто и если это ложно 'x=1' заявление никогда не достигается.

Это не верно, так как вы не имеете еще если сопровождаемый .

Кроме того, Начиная с System.exit (0) является просто вызовом функции и не различным путем выполнения кода, Явский компилятор принимает код после него, чтобы быть очень достижимый . Посмотрите это нить для большей ясности

Насколько последняя переменная затронута, она не может быть назначенный дважды .

Ниже кода работал бы без ошибки, начиная с я == 0 могу быть, любой верный или , ложный , и x назначен только однажды

    int i=0;
    final int x;
    if(i==0){
        x=1;
        System.exit(0); 
    }
    else {
        x=2;
    }
1
добавлено
да теперь я получил его.Thank you.
добавлено автор drarkayl, источник
прочитайте отредактированный вопрос.
добавлено автор drarkayl, источник
Спасибо за ответ, я понял вашу мысль, но если вы видите поток выполнения, я не назначаю его дважды. Это назначено только однажды.
добавлено автор drarkayl, источник
вы говорите x=1 и затем x=2 , таким образом x становится назначенным дважды
добавлено автор sanbhat, источник
@drarkayl System.exit не считают как кодовое завершение... не возвращением.. таким образом согласно компилятору, коду после того, как System.exit() может выполнить
добавлено автор sanbhat, источник

у x будет стоимость 1 или 2 в зависимости от если заявление. Если, 'если' верный последнее заявление не достигнуто и если это ложно 'x=1' заявление никогда не достигается.

Это не верно, так как вы не имеете еще если сопровождаемый .

Кроме того, Начиная с System.exit (0) является просто вызовом функции и не различным путем выполнения кода, Явский компилятор принимает код после него, чтобы быть очень достижимый . Посмотрите это нить для большей ясности

Насколько последняя переменная затронута, она не может быть назначенный дважды .

Ниже кода работал бы без ошибки, начиная с я == 0 могу быть, любой верный или , ложный , и x назначен только однажды

    int i=0;
    final int x;
    if(i==0){
        x=1;
        System.exit(0); 
    }
    else {
        x=2;
    }
1
добавлено
да теперь я получил его.Thank you.
добавлено автор drarkayl, источник
прочитайте отредактированный вопрос.
добавлено автор drarkayl, источник
Спасибо за ответ, я понял вашу мысль, но если вы видите поток выполнения, я не назначаю его дважды. Это назначено только однажды.
добавлено автор drarkayl, источник
вы говорите x=1 и затем x=2 , таким образом x становится назначенным дважды
добавлено автор sanbhat, источник
@drarkayl System.exit не считают как кодовое завершение... не возвращением.. таким образом согласно компилятору, коду после того, как System.exit() может выполнить
добавлено автор sanbhat, источник

Компилятор не знает ничто больше System.exit, что это - функция. Это принимает, выполнение продолжится.

Добавьте возвращение после System.exit, и это соберет.

1
добавлено

Компилятор не знает ничто больше System.exit, что это - функция. Это принимает, выполнение продолжится.

Добавьте возвращение после System.exit, и это соберет.

1
добавлено

Как только вы объявили некоторую переменную как финал тогда, вы не можете назначить ему стоимость

1
добавлено

Есть понятие "Определенного Назначения" , Ява. Это идет как это.

Явский компилятор должен выполнить определенный консервативный анализ потоков, чтобы удостовериться, что, для каждого доступа локальной переменной или чистой заключительной области f, f определенно назначен перед доступом; иначе ошибка времени компиляции должна произойти.

The idea behind definite assignment is that an assignment to the local variable or blank final field must occur on every possible execution path to the access. The analysis takes into account the structure of statements and expressions; it also provides a special treatment of the expression operators !, &&, ||, and ? :, and of boolean-valued constant expressions.

Теперь, поскольку я упомянул, что анализ потоков проверяет на Определенное Назначение, и это происходит в <сильном>, если пункт в вашем случае и вне вас снова пытается изменить ценность x , и это не будет позволено...

0
добавлено

Есть понятие "Определенного Назначения" , Ява. Это идет как это.

Явский компилятор должен выполнить определенный консервативный анализ потоков, чтобы удостовериться, что, для каждого доступа локальной переменной или чистой заключительной области f, f определенно назначен перед доступом; иначе ошибка времени компиляции должна произойти.

The idea behind definite assignment is that an assignment to the local variable or blank final field must occur on every possible execution path to the access. The analysis takes into account the structure of statements and expressions; it also provides a special treatment of the expression operators !, &&, ||, and ? :, and of boolean-valued constant expressions.

Теперь, поскольку я упомянул, что анализ потоков проверяет на Определенное Назначение, и это происходит в <сильном>, если пункт в вашем случае и вне вас снова пытается изменить ценность x , и это не будет позволено...

0
добавлено
pro.jvm
pro.jvm
3 503 участник(ов)

Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш сайт: projvm.com projvm.ru Наш канал: @proJVM Вакансии: @jvmjobs Конфы: @jvmconf

Java & Co
Java & Co
2 370 участник(ов)

Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/75723 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude

learn.java
learn.java
1 888 участник(ов)

Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat

Java Underground
Java Underground
169 участник(ов)

https://vk.com/javatutorial

Javanese Questions
Javanese Questions
109 участник(ов)

Чат предназначен для обмена знаниями строго в формате в вопрос-ответ. Тема — Java, Kotlin и Android. Вопрос должен быть предварительно прогуглен, понятно и грамотно сформулирован, помечен хэштегами. Ответ — тем более. Куски кода размером в несколько строк можно писать прямо здесь, для больших кусков кода стоит использовать http://gist.github.com/, http://pastebin.com/, https://codeshare.io/ или любой аналогичный сервис. В некоторых случаях можно прикреплять скриншоты. Стикеры и гифки запрещены. Дополнять и уточнять вопросы и ответы — редактированием исходного сообщения. Обсуждения должны приводить к редактированию вопроса/ответа и удаляться. По хештегам можно искать существующие вопросы и овтеты: #вопрос #ответ #git #generics #java #server #awt #javafx #swing #kotlin #anko #tornadofx #ktor #android #recyclerView #performance #arch #network #permissions #storage #async