Java try-catch-нарешті, блок

Якщо я запускаю наступний код:

try{
   return false;
} catch(Exception e){
       e.printStackTrace();
}
finally{
   return true;
}

чому він повертає true ?

1
Це погано . Ніколи, ніколи не виходьте з остаточного блоку з поверненням/киданням/перервою/продовженням. Ніколи не дозволяйте поширювати виняток із блоку end .
додано Автор devnull, джерело
додано Автор Daniel, джерело

12 Відповіді

From the Java Language Specification section 14.20.2

  • If execution of the try block completes abruptly for any other reason R, then the finally block is executed, and then there is a choice:
    • If the finally block completes normally, then the try statement completes abruptly for reason R.
    • If the finally block completes abruptly for reason S, then the try statement completes abruptly for reason S (and reason R is discarded).

(курсив мій). return є одним з видів "різкого завершення", іншими словами, return з finally перевизначає те, що відбувається всередині try .

4
додано

From the Java Language Specification section 14.20.2

  • If execution of the try block completes abruptly for any other reason R, then the finally block is executed, and then there is a choice:
    • If the finally block completes normally, then the try statement completes abruptly for reason R.
    • If the finally block completes abruptly for reason S, then the try statement completes abruptly for reason S (and reason R is discarded).

(курсив мій). return є одним з видів "різкого завершення", іншими словами, return з finally перевизначає те, що відбувається всередині try .

4
додано

From the Java Language Specification section 14.20.2

  • If execution of the try block completes abruptly for any other reason R, then the finally block is executed, and then there is a choice:
    • If the finally block completes normally, then the try statement completes abruptly for reason R.
    • If the finally block completes abruptly for reason S, then the try statement completes abruptly for reason S (and reason R is discarded).

(курсив мій). return є одним з видів "різкого завершення", іншими словами, return з finally перевизначає те, що відбувається всередині try .

4
додано

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

1
додано

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

1
додано

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

1
додано

It returns true because whenever a finally block completes abruptly, either by return-ing or by throwing an exception, that completion supersedes any previous return-value or exception. (See §14.20.2 "Execution of try-finally and try-catch-finally" in the Java Language Specification, Java SE 7 Edition.)

1
додано
@RussellZahniser: Так, ви прокоментували, як я додавав посилання. (Але зауважте, що це конкретне речення насправді не є тим, що застосовується в даному випадку. Для цього випадку є окремий, подібний випадок.)
додано Автор ruakh, джерело
Специфікація JLS - "Якщо остаточний блок швидко закінчується причиною S, то оператор try завершується різко для причини S."
додано Автор Russell Zahniser, джерело

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

1
додано

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

1
додано

Нарешті, блок не виконується при спробі або блоці вилучення блоку, зателефонувавши за допомогою функції System.exit . Аналогічним чином, якщо поточна спроба спробувати ловити помирає при виконанні блоку try or catch, то, нарешті, блок може не виконуватись.

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

0
додано

Нарешті, блок не виконується при спробі або блоці вилучення блоку, зателефонувавши за допомогою функції System.exit . Аналогічним чином, якщо поточна спроба спробувати ловити помирає при виконанні блоку try or catch, то, нарешті, блок може не виконуватись.

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

0
додано

Нарешті, блок не виконується при спробі або блоці вилучення блоку, зателефонувавши за допомогою функції System.exit . Аналогічним чином, якщо поточна спроба спробувати ловити помирає при виконанні блоку try or catch, то, нарешті, блок може не виконуватись.

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

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