В этом коде будет someVar
установлено, даже если выполняется блок catch и выбрасывается второе Exception?
public void someFunction() throws Exception {
try {
//CODE HERE
} catch (Exception e) {
Log.e(TAG, "", e);
throw new Exception(e);
} finally {
this.someVar= true;
}
}
java
exception-handling
Джекс
источник
источник
Ответы:
Да, блоки finally всегда выполняются ... кроме случаев:
System.exit(0);
Кроме того, если метод в вашем блоке finally выдает неперехваченное исключение, то после этого ничего не будет выполнено (т.е. исключение будет выброшено, как и в любом другом коде). Очень распространенный случай, когда это происходит
java.sql.Connection.close()
.В стороне, я предполагаю, что образец кода, который вы использовали, является всего лишь примером, но будьте осторожны, помещая фактическую логику внутри блока finally. Блок finally предназначен для очистки ресурсов (закрытие соединений с БД, освобождение дескрипторов файлов и т. Д.), А не для логики обязательного запуска. Если он должен быть запущен, сделайте это до блока try-catch, вдали от чего-то, что может вызвать исключение, поскольку ваше намерение почти наверняка функционально такое же.
источник
finally
определяется в терминах нормального и внезапного завершения.Да.
См. Документацию :
Исключения:
источник
Наконец, всегда выполняется блок.
public class ExceptionTest { public static void someFunction(String input) throws Exception { try { if( input.equals("ABC") ) { System.out.println("Matched"); } } catch (Exception e) { throw new Exception(e); } finally { System.out.println("Input Is "+input+" Finally Executed!!!"); } } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub try { System.out.println("********* Test with VALUE ********* "); someFunction("ABC"); System.out.println("\r\n********* Test with NULL ********* "); someFunction(null); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } }
}
источник
Наконец, всегда выполняется, независимо от вашего случая, т.е.
Для непроверенных исключений java не требует обработки ошибок. по этой причине, если непроверенное исключение возникает в блоке finally и для этого не выполняется никакой обработки, то код, написанный ниже этой точки (где возникла ошибка), не будет выполнен.
Поэтому я предлагаю всегда обрабатывать все исключения, независимо от того, отмечен он или нет. Таким образом, вы можете убедиться, что блок кода в finally также выполняется независимо от того, возникает ли непроверенное исключение. у вас есть место в sub-nest catch и finally block, чтобы выполнить необходимую работу.
источник
Блок finally всегда выполняется при выходе из блока try, если только вы не используете System.exit (0) в вашей попытке или улове.
источник
Да.
finally
block выполняется всегда, за исключением случая, когда вы вызываете System.exit (), потому что он останавливает виртуальную машину Java.источник