3

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

我想知道的是它不会抛出OutOfMemoryError. 任何人都可以提出为什么似乎很明显任何人都将数字大于机器的内存。

链接:相关的java文档

PS:如果我幼稚,请多多包涵。

4

4 回答 4

6

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

请注意,文档中不必明确提及整个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但为了生成适当的调试条目或尝试关闭文件、流、连接、保存未保存的资源等,可能值得一试。

于 2013-09-06T12:13:50.813 回答
2

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

于 2013-09-06T12:16:31.323 回答
0

它确实抛出OutOfMemoryError。java doc只说ensureCapacity

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

当它这样做时,它可能会抛出OutOfMemoryError.

尝试运行这个:

ArrayList<Integer> l = new ArrayList<Integer>();
int i=0;
while(true) {
    l.add(i++);
}
于 2013-09-06T12:14:29.273 回答
0

OutOfMemoryErrorjavadoc 中没有提到它,因为它不是 CheckedException,因此它不是 API 规范的一部分。

它甚至不是一个,Exception而是一个Error,所以你不应该试图捕捉或处理它,因为可能已经对你的运行时环境造成了一些损害......

于 2013-09-06T12:18:39.773 回答