Java: Гипотетический вопрос о блоке finally - PullRequest
0 голосов
/ 04 апреля 2011

Что произойдет, если вы выбросите ошибку в блоке finally?Обрабатывается ли это в одном из соответствующих предложений catch?

Ответы [ 7 ]

6 голосов
/ 04 апреля 2011

Только если вы поместите другой блок try-catch в блок finally.В противном случае это ошибка, как и любая другая.

2 голосов
/ 04 апреля 2011

Вам необходимо включить блоки try-catch внутри блоков finally или catch.

например:

try {
    // your code here
} finally {
    try {
        // if the code in finally can throw another exception, you need to catch it inside it
    } catch (Exception e) {
       // probably not much to do besides telling why it failed
    }
} catch (Exception e) {
    try {
        // your error handling routine here
    } catch (Exception e) {
       // probably not much to do besides telling why it failed
    }
}
2 голосов
/ 04 апреля 2011

Он будет не обрабатывать исключение до тех пор, пока не будет окончательно заблокирован.

public static void main(String[] args) throws Exception {
        try {
            System.out.println("In try");
        } catch (Exception e) {
            System.out.println("In catch");
        } finally{
            throw new Exception();
        }

    }

Приведенный выше код вызовет исключение, но если вы сделаете следующееэто будет работать:

public static void main(String[] args){
        try {
            System.out.println("In try");
        } catch (Exception e) {
            System.out.println("In catch");
        } finally{
             try{
                     throw new Exception();
                 }catch(Exception e){}
        }

    }
1 голос
/ 04 апреля 2011

Нет, блок перехвата может перехватывать только исключения, выданные в соответствующем блоке try, но не блок finally.(Конечно, если этот блок finally находится внутри другого блока try, предложения catch для этого блока try все еще используются.)

Соответствующий раздел в JLS 14,20 .Каждый из перечисленных там потоков имеет что-то вроде этого:

Если блок finally завершается внезапно по какой-либо причине, то оператор try завершается преждевременно по той же причине.Другими словами, ни одна из фраз catch, связанных с блоком finally, не пытается обработать исключение.

1 голос
/ 04 апреля 2011

Нет, это не так. Вам придется обработать его в блоке finally или определить правильное объявление throw в описании метода.

1 голос
/ 04 апреля 2011

Неа.Это было бы поймано уловом, где тогда весь try / catch / наконец был вложен в другой try / catch.В противном случае исключение будет выброшено из функции и будет обработано вызывающей функцией.

0 голосов
/ 04 апреля 2011

Порядок выполнения обычно напрямую указывается в порядке операторов: 1. try, 2. перехват исключений в указанном порядке (выполняется только один перехват), 3. наконец.

Таким образом, когда выполняется блок finally (обратите внимание, что это всегда так, даже если оператор return или исключение выдается в блоках try или catch), выполнение оператора try находится на своей последней фазе и, таким образом, это не может поймать дальнейшие броски. Как уже указывалось, исключение должно быть обработано в месте, расположенном дальше по стеку (или вверх, в зависимости от точки обзора;)).

...