Різниця між нарешті і писати після зловити

Яка різниця між "нарешті" та написанням після "лови"?

Наприклад:

public boolean example() {
    try {
       //Code
    } catch (RuntimeException e) {
       //Code
    } finally {
        return true;
    }
}

public boolean example() {
    try {
       //Code
    } catch (RuntimeException e) {
       //Code
    } 
    return true;
}
8
Ви можете додати логіку, щоб закрити ресурси в блочному викладі finally і отримати виняток тут, тому найкраща альтернатива була б останньою (IMO).
додано Автор Luiggi Mendoza, джерело
ніякої різниці у вашому прикладі. Зробіть деяку очистку нарешті, яка буде виконана в будь-якому випадку.
додано Автор Tala, джерело

10 Відповіді

Перш за все, єдиним ідіомом, який навіть можна вважати кандидатом , є такий:

try {
 //stuff
} catch (Throwable t) { /* handle */ }
// finally stuff

Зверніть увагу на виловлений тип. Тільки якщо ви зірвете будь-яке можливе виключення, включаючи такі темні монстри, як ThreadDeath і VirtualMachineError , ви можете надійти на безумовне досягнення коду нижче try-catch.

Але це тільки там, де він починається. Що робити, якщо сам код обробки видає виняток? Отже, вам потрібно щонайменше

try { /* main stuff */ }
catch (Throwable t) {
  try { /* handle */ } catch (Throwable t) { 
   //no code allowed here! Otherwise we descend into infinite recursion
  }
}
/* finally stuff */

Тепер ви можете почати усвідомлювати переваги finally , але це ще не все. Розглянемо досить типовий сценарій:

try { 
  /* main stuff, may throw an exception. I want the exception to
     break what I'm doing here and propagate to the caller */ 
  return true;
} finally { /* clean up, even if about to propagate the exception */ }

Як ви переписуєте це? Без дублювання коду, неможливо.

5
додано

У наданому вами коді немає різниці. Але, нарешті, використовується для запуску певного фрагмента коду після блоку try, незалежно від того, чи є виняток чи ні.

Цікавим моментом тут є те, що ми повинні уникати повернення з кінцевого блоку, оскільки це може створити плутанину в сценарії, коли ми повертаємо теж із блоку try. Розглянемо цей фрагмент коду:

try {
    return true;
}
finally {
    return false;
}

Тепер цей код повернеться помилково, незалежно від того, що відбувається в спробі. Багато в чому ця поведінка точно відповідає розмовному розуміння того, що, нарешті, означає - "незалежно від того, що відбувається заздалегідь в блоці спроб, завжди запускай цей код". Отже, якщо ви отримаєте істину з остаточного блоку, загальний ефект повинен завжди бути, щоб повернути істинне, ні?

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

3
додано
Якщо, нарешті, закінчується раптово, після повернення або викидання винятку, будь-яке попереднє повернення виклику функції ігнорується. Це означає, що нарешті буде проковтнути будь-яке виняток або звичайне повернене значення, якщо він викидає виняток або ви використовуєте повернення. Як зазначено, використовуйте нарешті для очищення ресурсів, і пам'ятайте, що якщо ви нарешті зробите дзвінки, які могли б виключити виняток, ви повинні загорнути їх в try-catch, щоб уникнути ковтання інших винятків. Якщо ви використовуєте try-with-resources, ви можете отримати ковтнути виняток за допомогою Throwable.getSuppressed ()
додано Автор Klaus Groenbaek, джерело

Ніякої різниці у Вашій справі. але

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

Це ідеальне місце для виконання очищення.

Зауважте, що якщо ви використовуєте JDK 7+, то більшість способів використання остаточного блоку можна усунути, просто скористайтеся заява try-with-resources .

2
додано

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

2
додано
Це просто неправильно. Код виконується після try-catch.
додано Автор Pieter De Bie, джерело

Ми використовуємо блок try, catch block і, нарешті, блокуємо обробку Exception в нашій програмі. Програма може бути перевірена або не встановлена. Виняток. тому цей блок використовується для обробки цих виключень. У блоці try ми згадуємо або напишемо код, який може бути причиною винятку, і якщо ми хочемо, щоб наш код запускався, якщо було зроблено виключення, то ми пишемо цей код у блоці зловмисників. Нарешті, це дуже особливий блок, який дає нам особливу особливість, яка полягає в тому, що якщо наш блок лову не буде запущений, то перед тим, як програма закінчиться, що, нарешті, блоковий код обов'язково виконуватиметься. в основному це використовується для збереження наших даних під час небажаного завершення програми. якщо ми використовуємо блок try, то після блоку спробу повинен бути блок вилучення, але, нарешті, необов'язковий необов'язковий.

1
додано

Оскільки Ваш код повертає true/false , він не вплине на багато. Але подумайте про будь-який інший код/​​логіку, де буде написано який-небудь обов'язковий/очищувальний код для виконання.

Крім того, буде важко зловити всі винятки за допомогою нашого коду, або, іншими словами, ми повинні зловити певні винятки, якими ми можемо впоратися. На цьому етапі , нарешті, буде справжнім рятівником, оскільки він буде завжди виконуватися (крім System.exit() або у деяких випадках рекурсії).

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

Ви також можете звернутися до нижчезазначених постів, щоб отримати додаткові пояснення:

0
додано

Перший випадок:

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

Другий випадок:

Якщо в блоці спроб існує виняток, то блок ловити буде виконуватися, а якщо є ще одне виняток у тому самому блоці, то "return true"; буде виконувати.

0
додано

Нарешті, блок корисний для очищення вашого коду, як закриття відкритих потоків.

Наприклад:

    File f = new File("\file.txt");
    FileStream fs;
    try{
       fs = new FileStream(f);
    } catch (IOException ioe){
       ioe.printStackTrace();
    } finally {
      if (fs != null) {
         fs.close()//close the stream
      }
    }
0
додано

Перше, що потрібно зрозуміти в цьому питанні: "Чому ми використовуємо try {} catch {} блок" Ok ".

Відповідь полягає в тому, коли існує можливість нашого коду викинути виняток.

These kind of code we put in try{... } block & catch {...} block contain the code to catch the exception generated by code in try{ } block.

Нарешті {...} блок містить код, який виконується одразу після блокування try {} catch {}, коли блок try {} видає виняток.

наприклад, коли ви відвідуєте якийсь веб-сайт, але з деякими проблемами на стороні сервера він не міг, і на сторінці з'являється повідомлення типу "404 error or server updating", цей тип коду записується нарешті в блок.

0
додано

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

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