为什么ensureCapacity不会抛出OutOfMemoryError

时间:2013-09-06 12:10:06

标签: java

我正在阅读java文档并遇到了这个函数:ensureCapacity(int minCapacity)

我不知道它不会抛出OutOfMemoryError。任何人都可以建议为什么显而易见的是,任何人都要把数字放大到机器的内存。

链接:相关java docs

P.S。:如果我天真,请忍受。

4 个答案:

答案 0 :(得分:6)

为什么文档中没有提到它?

请注意,文档中不必明确提及整个Error ThrowableRuntimeExceptionExceptions也是如此。只有经检查的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被抓住?

我离题了,因为我读到这个问题的另一个答案。有人说“你不应该试图捕捉或处理它”。

虽然从这种情况中恢复确实几乎是不可能的,但是{{1}}可能值得捕获,只是为了生成适当的调试条目或尝试关闭文件,流,连接,保存未保存的资源等。

答案 1 :(得分:2)

只应在throws子句中指定您希望调用代码处理的异常/错误。你不会指望调用者处理内存不足,所以没有提到。这是一个你不应该试图恢复的运行时条件。

答案 2 :(得分:0)

它会抛出OutOfMemoryError。 java doc只说ensureCapacity

  

如有必要,增加此ArrayList实例的容量。

虽然这样做但可能会抛出OutOfMemoryError

尝试运行:

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

答案 3 :(得分:0)

javadoc中没有提到

OutOfMemoryError,因为它不是CheckedException,因此它不是API规范的一部分。

它甚至不是Exception而是Error,因此您不应该尝试捕获或处理它,因为可能已经对您的运行时环境造成了一些损害......