2013-09-06 2 views
3

Я читал через ява документы и наткнулся на эту функцию: ensureCapacity(int minCapacity)Почему ensureCapacity не бросать OutOfMemoryError

Что интересно, что это не бросает OutOfMemoryError. Может ли кто-нибудь предположить, почему, как кажется очевидным, кто-то может поставить цифры больше, чем память машины.

Ссылка: отношение java docs

P.S .: Пожалуйста, медведь, если я наивный.

+0

OutOfMemoryError как правило, не в списке возможное исключение из отдельных инструкций. Это справедливо для большинства, если не для всех подклассов Error, поскольку они распространены и обычно не считаются обрабатываемыми. –

+0

Просто _anything_ может вызывать 'OutOfMemoryError', но это не значит, что вы должны попытаться поймать его или разобраться с ним. –

ответ

6

Почему это не упоминается в документации?

Обратите внимание, что весь класс ErrorThrowable не обязательно должен указываться в документации. То же самое касается 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 может быть стоит ловить только для создания соответствующей записи отладки или пытаться закрыть файлы, потоки, соединения, за исключением несохраненные ресурсов и т.д.

+0

Но документы не сообщают об этом почему? –

+2

Я предполагаю, что OP хотел спросить, почему это не упоминается в подписи, например. "public void protectCapacity (int minCapacity) выбрасывает OutOfMemoryError" – eis

+0

@ Это спасибо, я продлил свой ответ. – Dariusz

0

Это делает бросок OutOfMemoryError. В java-документе говорится только, что ensureCapacity

Увеличивает емкость этого экземпляра ArrayList, если это необходимо.

Пока он делает это, он может бросать OutOfMemoryError.

попробуйте запустить это:

ArrayList<Integer> l = new ArrayList<Integer>(); 
int i=0; 
while(true) { 
    l.add(i++); 
} 
2

только исключения/ошибки, которые вы хотите код вызова для обработки должны быть указаны в бросках положение. Вы не ожидали, что вызывающий абонент будет работать с исчерпанием памяти, поэтому он не упоминается. Это условие выполнения, от которого вы не должны пытаться восстановиться.

0

OutOfMemoryError не упоминается в javadoc, поскольку это не исключение CheckedException, и поэтому он не является частью спецификации API.

Это даже не Exception но Error, так что вы не должны пытаться поймать или справиться с этим, так как там, возможно, уже были некоторые ущерб, нанесенный вашей окружающей среды во время выполнения ...

+2

«Вы не должны пытаться его поймать или обрабатывать» - это мнение, и я не согласен с ним. Хотя восстановление из такой ситуации практически невозможно, «Ошибка» может стоить ловить только для создания соответствующей записи отладки или закрытия файлов, потоков, соединений. – Dariusz

+1

@Dariusz Я соглашаюсь на ловить, но mor в какой-то общей, общесистемной обработке ошибок, чем после определенного вызова, поскольку, как мы, кажется, согласны, вы не сможете многое сделать. –

Смежные вопросы