Почему это не упоминается в документации?
Обратите внимание, что весь класс Error
Throwable
не обязательно должен указываться в документации. То же самое касается RuntimeException
. Только проверенные Exceptions
должны присутствовать в документации, например IOException
.
Общая идея классов Error
заключается в том, что они представляют собой ситуации, которые могут произойти практически в любой момент и очень трудно восстановить. Упоминание об этом во всех возможных классах и методах было бы бессмысленным.
Доказательство того, что она брошена
import java.util.ArrayList;
public class OOMETest {
public static void main(String[] args)
{
ArrayList<ArrayList<Object>> listOfLists = new ArrayList<ArrayList<Object>>();
listOfLists.ensureCapacity(Integer.MAX_VALUE);
while (true) {
ArrayList<Object> list = new ArrayList<Object>();
list.ensureCapacity(Integer.MAX_VALUE);
listOfLists.add(list);
}
}
}
И трассировки стека
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:2760)
at java.util.Arrays.copyOf(Arrays.java:2734)
at java.util.ArrayList.ensureCapacity(ArrayList.java:167)
at OOMETest.main(OOMETest.java:9)
Если Errors
поймают?
Я отвлекся здесь из-за другого ответа на этот вопрос, который я прочитал. Кто-то сказал, что «вы не должны пытаться поймать или справиться с этим».
Выздоравливая от такой ситуации действительно практически невозможно, Error
может быть стоит ловить только для создания соответствующей записи отладки или пытаться закрыть файлы, потоки, соединения, за исключением несохраненные ресурсов и т.д.
OutOfMemoryError как правило, не в списке возможное исключение из отдельных инструкций. Это справедливо для большинства, если не для всех подклассов Error, поскольку они распространены и обычно не считаются обрабатываемыми. –
Просто _anything_ может вызывать 'OutOfMemoryError', но это не значит, что вы должны попытаться поймать его или разобраться с ним. –