Если в конструкторе объекта выдается исключение, оно мало чем отличается от поиска исключения в вызове метода, за исключением того, что вы можете гарантировать, что ваш объект не был создан
NewObject obj = null;
try {
obj = new NewObject() {
} catch (Throwable t) {
// obj is null.
}
Возможность восстановления после такого исключения сильно зависит от выданного исключения. Проверенные исключения ожидаются, но встречаются нечасто; как правило, они легче всего оправиться от. Непроверенные исключения имеют дело с такими вещами, как деление на ноль (где ловить каждый возможный бросок было бы громоздким). Ошибки - это ситуации, когда программа может дать сбой из-за стандартных предположений о том, что обычная работа JVM не выполняется (например, возможность выделить больше памяти).
Возможно восстановление после определенных ошибок JVM; однако, ошибки, которые вы хотите устранить, и способы их восстановления должны быть тщательно спланированы. Обычно можно увидеть попытки восстановления после ошибок JVM при работе с нехваткой памяти (псевдо-Java-код следует)
Runtime runtime = Runtime.getRuntime();
while (true) {
Cache myCache = new SomeCache();
try {
Message message = messages.getMessage();
if (!(cache.hasKey(message))) {
Result result = messageProcessor.getResult(message);
cache.put(message, result);
}
message.getReplyChannel().send(cache.get(message));
} catch (OutOfMemoryException e) {
myCache.clear();
runtime.gc();
messages.putBack(message);
}
}
Ценность такого решения сильно зависит от остальной части конструкции системы. Предполагая, что «кэш» имеет ограниченный максимальный размер, это все равно может быть полезно, если другой раздел программы начнет загружать память. Главное, чтобы ваши операции по освобождению памяти зависели от уже выделенных объектов, что не приведет к увеличению потребности системы в памяти, поскольку она пытается освободить память.