Вы задаете неправильный вопрос. Если вы ожидаете выбросить VirtualMachineError
, вы не можете ожидать, что поведение будет гарантировано оставаться неизменным, независимо от того, есть ли try … catch
или нет.
Чтобы остаться в вашем примере:
try { return 1; }
catch (Throwable t) { return 2; }
Для этого кода, будет обработчик исключений для двух команд байт кода iload_1
, ireturn
. Это означает, что если VirtualMachineError
поднят непосредственно перед инструкцией iload_1
или сразу после того, как JVM столкнулась с инструкцией ireturn
, ошибка не будет обнаружена. И никто не может отличить эту ситуацию от ситуации, когда обработчик исключений удален, и ошибка возникает между этими инструкциями.
Сравнить с The Java® Virtual Machine Specification, Java SE 8 Edition §2.10. Exceptions:
Java, виртуальная машина может позволить небольшой, но ограниченное количество выполнения произойти до того, асинхронное исключение. Эта задержка разрешена для того, чтобы оптимизированный код обнаруживал и выдавал эти исключения в тех точках, где практично обрабатывать их, подчиняясь семантике языка программирования Java.
Так что для случая VirtualMachineError
, отсутствие обработчика исключений не будет никакой разницы, никто не может заметить и JVM может отложить ошибка в любом случае в зависимости от внутреннего состояния оптимизации кода. В другом случае возможна ireturn
сбрасывание IllegalMonitorStateException
.
В конце концов, вопрос в том, что вы собираетесь оптимизировать. Обработчики исключений обычно не влияют на производительность, поскольку JVM не затрагивает их, если исключение не должно обрабатываться.
Возможный дубликат [No-throw VirtualMachineError гарантирует] (http://stackoverflow.com/questions/8728866/no-throw-virtualmachineerror-guarantees) – Raedwald