Остаточна помилка присвоєння змінної

Я не знаю, якщо це дурне питання чи ні, але, будь ласка, спробуйте відповісти на це.

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

У мене є остаточна змінна x.

Тепер, щоб присвоїти значення x, у мене є оператор if, який призначає його і виходить з програми.

Тепер останній вислів ніколи не досягнуто і, таким чином, ця програма повинна бути логічно зібрана.

x буде мати значення 1 або 2 в залежності від оператора if. Якщо 'if' є істинним, то останнє твердження не досягається, а якщо воно невірно, то оператор 'x = 1' ніколи не буде досягнутий.

Тож чому це дає мені помилку компіляції "локальної" змінної була ініціалізована?

EDIT:

Так, я, очевидно, знаю, що остаточне твердження може бути призначене лише один раз.

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

1
перевірте коментар, що говорить про призначення функції Definіat Assignment в java
додано Автор Rupesh, джерело

9 Відповіді

Final is Final 

як тільки ви оголосили та призначили, ви не зможете знову призначити його.

І остаточне призначення - це перевірка часу компіляції. Навіть якщо ви виходите з функції, перш ніж він виконуватиме свій обов'язок :).

2
додано
x = 2; це оператор присвоєння права ?? Можливість тут додати ще умова і призначити там.
додано Автор ꜱᴜʀᴇꜱʜ ᴀᴛᴛᴀ, джерело
@LuigiEdlCarno саме те, що я шукав. Дякую.
додано Автор drarkayl, джерело
але тільки одне з цих тверджень досягається, коли відбувається виконання
додано Автор drarkayl, джерело
так, але я насправді не перепризначаю його. він призначається лише один раз під час виконання програми.
додано Автор drarkayl, джерело
@drarkayl Corrent, "... коли відбувається виконання" , але це помилка часу компіляції, і оскільки ваш виклик System.exit (0); не мати наступний код return , компілятор передбачає, що завдання буде виконано також після if.
додано Автор LuigiEdlCarno, джерело
Final is Final 

як тільки ви оголосили та призначили, ви не зможете знову призначити його.

І остаточне призначення - це перевірка часу компіляції. Навіть якщо ви виходите з функції, перш ніж він виконуватиме свій обов'язок :).

2
додано
x = 2; це оператор присвоєння права ?? Можливість тут додати ще умова і призначити там.
додано Автор ꜱᴜʀᴇꜱʜ ᴀᴛᴛᴀ, джерело
@LuigiEdlCarno саме те, що я шукав. Дякую.
додано Автор drarkayl, джерело
але тільки одне з цих тверджень досягається, коли відбувається виконання
додано Автор drarkayl, джерело
так, але я насправді не перепризначаю його. він призначається лише один раз під час виконання програми.
додано Автор drarkayl, джерело
@drarkayl Corrent, "... коли відбувається виконання" , але це помилка часу компіляції, і оскільки ваш виклик System.exit (0); не мати наступний код return , компілятор передбачає, що завдання буде виконано також після if.
додано Автор LuigiEdlCarno, джерело

x матиме значення 1 або 2 в залежності від оператора if. Якщо "якщо" є   true, останнє твердження не досягнуто, а якщо воно невірно, то "x = 1"   Заява не досягнута.

Це не так, оскільки у вас DONT є if , а потім else .

Крім того, оскільки System.exit (0) - це просто виклик функції, а не інший шлях коду, компілятор Java приймає код після нього, щоб бути дуже доступним . Докладніше про це потоку .

Що стосується остаточної змінної, не може бути призначено двічі .

Нижче код буде працювати без помилок, оскільки i == 0 може бути або true , або false , а x привласнюється лише один раз

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

x матиме значення 1 або 2 в залежності від оператора if. Якщо "якщо" є   true, останнє твердження не досягнуто, а якщо воно невірно, то "x = 1"   Заява не досягнута.

Це не так, оскільки у вас DONT є if , а потім else .

Крім того, оскільки System.exit (0) - це просто виклик функції, а не інший шлях коду, компілятор Java приймає код після нього, щоб бути дуже доступним . Докладніше про це потоку .

Що стосується остаточної змінної, не може бути призначено двічі .

Нижче код буде працювати без помилок, оскільки i == 0 може бути або true , або false , а x привласнюється лише один раз

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

Компілятор не знає нічого іншого System.exit, що це функція. Передбачається, виконання буде продовжено.

Додайте результат після System.exit, і він буде компілюватися.

1
додано

Компілятор не знає нічого іншого System.exit, що це функція. Передбачається, виконання буде продовжено.

Додайте результат після System.exit, і він буде компілюватися.

1
додано

Після того, як ви оголосили деяку змінну як остаточну, ви не можете присвоїти йому значення

1
додано

Існує поняття "Definite Assignment" - це Java. Це відбувається так.

Компілятор Java повинен виконувати спеціальний консервативний аналіз потоку, щоб переконатися, що для кожного доступу локальної змінної чи порожнього кінцевого поля 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.

Тепер, як я вже згадував, аналіз потоку перевіряє призначення функції Definite Assignment, і це відбувається в якщо у вашій справі та за його межами, знову намагається змінити значення x , і це не буде допускається...

0
додано

Існує поняття "Definite Assignment" - це Java. Це відбувається так.

Компілятор Java повинен виконувати спеціальний консервативний аналіз потоку, щоб переконатися, що для кожного доступу локальної змінної чи порожнього кінцевого поля 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.

Тепер, як я вже згадував, аналіз потоку перевіряє призначення функції Definite Assignment, і це відбувається в якщо у вашій справі та за його межами, знову намагається змінити значення x , і це не буде допускається...

0
додано
ІТ КПІ - Java
ІТ КПІ - Java
436 учасників