If an exception is thrown inside a catch block, the control is transferred to the next outer catch block or to the nearest finally block if available. If no outer catch block is found, the exception will propagate up the call stack, potentially causing the program to terminate if uncaught.

For example:

try {
    // code
} catch (Exception e) {
    throw new RuntimeException("Error in catch");
} finally {
    // cleanup
}

In this case, the thrown RuntimeException will propagate, but the finally block will still execute.