Я просматриваю новый код. В программе есть только блок попыток и окончание. Поскольку блок catch исключен, как работает блок try, если он встречает исключение или что-то бросаемое? Он просто переходит непосредственно в блок finally?
Я просматриваю новый код. В программе есть только блок попыток и окончание. Поскольку блок catch исключен, как работает блок try, если он встречает исключение или что-то бросаемое? Он просто переходит непосредственно в блок finally?
Ответы:
Если какой-либо код в блоке try может вызвать проверенное исключение, оно должно появиться в предложении throws сигнатуры метода. Если выбрано непроверенное исключение, оно выскакивает из метода.
Блок finally всегда выполняется, независимо от того, выброшено исключение или нет.
Небольшое примечание по try
/ finally
: finally всегда будет выполняться, если
System.exit()
называется.try{}
блоке не заканчивается (например , бесконечный цикл).try{..} catch{ throw ..} finally{..}
? Думаю ваще не исполнят
Спецификация языка Java (1) описывает, как try-catch-finally
выполняется. Отсутствие улова эквивалентно отсутствию улова, способного поймать данный Throwable.
- Если выполнение блока try завершается внезапно из-за выброса значения V, тогда есть выбор:
- Если тип времени выполнения V может быть назначен параметру любого предложения catch оператора try, то
……- Если тип времени выполнения V не может быть назначен параметру какого-либо предложения catch оператора try, то выполняется блок finally . Тогда есть выбор:
- Если блок finally завершается нормально, то оператор try завершается внезапно из-за выброса значения V.
- Если блок finally завершается внезапно по причине S, то оператор try завершается внезапно по причине S (и выброс значения V отбрасывается и забывается).
Внутреннее значение finally выполняется до выброса исключения во внешний блок.
public class TryCatchFinally {
public static void main(String[] args) throws Exception {
try{
System.out.println('A');
try{
System.out.println('B');
throw new Exception("threw exception in B");
}
finally
{
System.out.println('X');
}
//any code here in the first try block
//is unreachable if an exception occurs in the second try block
}
catch(Exception e)
{
System.out.println('Y');
}
finally
{
System.out.println('Z');
}
}
}
Результаты в
A
B
X
Y
Z
Блок finally всегда запускается после завершения блока try, независимо от того, заканчивается ли попытка нормально или ненормально из-за исключения, например, throwable.
Если какой-либо код в блоке try вызывает исключение, текущий метод просто повторно генерирует (или продолжает генерировать) то же исключение (после выполнения блока finally).
Если блок finally выдает исключение / ошибку / выброс и уже есть ожидающий выброс, он становится некрасивым. Откровенно говоря, я забываю, что именно происходит (так много лет назад я получил сертификат). Я думаю, что обе метательные объекты связаны друг с другом, но есть какое-то особое колдовство, которое вам нужно сделать (то есть - вызов метода, который мне нужно было бы найти), чтобы получить исходную проблему до того, как "наконец-то" вырвало, э-э ...
Между прочим, try / finally - довольно распространенная вещь для управления ресурсами, поскольку в java нет деструкторов.
Например -
r = new LeakyThing();
try { useResource( r); }
finally { r.release(); } // close, destroy, etc
«Наконец», еще один совет: если вы действительно потрудились поставить в улове, либо поймать конкретный (ожидается) Throwable подклассов, или просто поймать «Throwable», не «Исключение», для общего приема всей ловушки ошибок. Слишком много проблем, таких как тупицы с отражением, выбрасывают «Ошибки», а не «Исключения», и они ускользнут от любого «улова всех», закодированного как:
catch ( Exception e) ... // doesn't really catch *all*, eh?
сделайте это вместо этого:
catch ( Throwable t) ...
Версии Java до версии 7 допускают эти три комбинации try-catch-finally ...
try - catch
try - catch - finally
try - finally
finally
блок будет всегда выполняться независимо от того, что происходит в блоке try
или / и catch
. поэтому, если catch
блока нет , исключение здесь обрабатываться не будет.
Тем не менее, вам все равно понадобится обработчик исключений где-нибудь в вашем коде - если, конечно, вы не хотите, чтобы ваше приложение полностью аварийно завершило работу. Это зависит от архитектуры вашего приложения, где именно находится этот обработчик.
- За блоком попытки Java должен следовать блок catch или finally.
- Для каждого блока try может быть ноль или более блоков catch, но только один блок finally.
- Блок finally не будет выполнен, если программа завершится (либо путем вызова System.exit (), либо из-за фатальной ошибки, вызывающей прерывание процесса).
как работает блок try, если он встречает исключение или что-то бросаемое
Исключение выбрасывается из блока, как и в любом другом случае, когда оно не перехвачено.
Блок finally выполняется независимо от того, как завершается блок try - независимо от того, есть ли вообще какие-либо уловки, независимо от того, есть ли совпадающий улов.
Блоки catch и finally являются ортогональными частями блока try. Вы можете иметь одно или оба. С Java 7 у вас не будет ни того, ни другого!
Разве вы не пробовали это с этой программой? Он перейдет к блоку finally и выполнит блок finally, но исключение не будет обработано. Но это исключение можно отменить в блоке finally!
Блок finally выполняется после завершения блока try. Если что-то брошено внутри блока try, когда оно выходит, выполняется блок finally.
Внутри try
блока мы пишем коды, которые могут вызывать исключение. В catch
блоке мы обрабатываем исключение. finally
Блок не всегда выполняется независимо от того , происходит ли исключение или нет.
Теперь, если у нас есть блок try-finally вместо блока try-catch-finally, то исключение не будет обрабатываться, и после блока try вместо блока управления, собирающегося перехватить блок, оно перейдет в блок finally. Мы можем использовать блок try-finally, когда мы не хотим ничего делать за исключением.