我正在尝试解决这个问题。
我正在使用HashMap
和Vector
个类。我必须迭代循环2 147 483 648次,但在HashMap
中存储8,438,409个值后,我得到OutOfMemoryError
。
我在Eclipse中运行该程序并设置-Xmx1024m选项,但它没有帮助。所以,我抓住了上面的错误,试图启动一个线程,将控件带到不同的类并开始执行。
然而,线程没有启动。我在其中放了System.out.println("We are here");
语句,它从未打印到控制台。有人可以帮我这个吗?
由于 有趣的
答案 0 :(得分:12)
您不想在catch {}
块中启动一个帖子。那是在尝试(并且没有)治疗症状而完全忽略原因。
您要做的是停止发生OutOfMemory错误。您可以选择增加堆大小,或者减少堆大小。
答案 1 :(得分:8)
您偶然发现了异常和java中的错误之间的区别。错误和异常都来自throwable,但只是捕获异常不会捕获错误。然而,错误通常非常严重,如果不是不可能从查看中恢复,则很难。 When to catch java.lang.Error?
答案 2 :(得分:4)
是的,您可以在catch块中启动一个线程。
但是,如果您收到OutOfMemoryError,则可能无法启动线程。 OutOfMemoryError意味着你的堆空间不足,并且所有线程都使用相同的堆空间(事实上,创建一个新线程将耗尽你已经减少的一些堆)。
答案 3 :(得分:1)
您不需要迭代每个值来解决基于collatz猜想的问题。我假设您正在尝试计算每个值。这是我试过的方法,但是遇到了同样的事情(尽管我使用的是.net)。
我不想试图解决技术问题,而是建议您改变方法。
注意:我意识到,我假设(没有理由),你正在尝试解决ProjectEuler.net问题(或类似问题)。如果不是这种情况,我的解决方案可能不可行。
答案 4 :(得分:-1)
是的,
在catch块中启动线程没有限制。但是,捕获异常时的正常行为是向用户显示,记录,反而抛出另一个异常,关闭应用程序。
正如其他人所说,在你的情况下,你试图捕获一个java.lang.Error,这不是一个Exception,并且你没有下一行代码执行的保证。