我可以在JAVA中的catch中启动一个线程

时间:2009-12-10 01:21:30

标签: java multithreading try-catch

我正在尝试解决这个问题。

我正在使用HashMapVector个类。我必须迭代循环2 147 483 648次,但在HashMap中存储8,438,409个值后,我得到OutOfMemoryError

我在Eclipse中运行该程序并设置-Xmx1024m选项,但它没有帮助。所以,我抓住了上面的错误,试图启动一个线程,将控件带到不同的类并开始执行。

然而,线程没有启动。我在其中放了System.out.println("We are here");语句,它从未打印到控制台。有人可以帮我这个吗?

由于 有趣的

5 个答案:

答案 0 :(得分:12)

您不想在catch {}块中启动一个帖子。那是在尝试(并且没有)治疗症状而完全忽略原因。

您要做的是停止发生OutOfMemory错误。您可以选择增加堆大小,或者减少堆大小。

答案 1 :(得分:8)

您偶然发现了异常和java中的错误之间的区别。错误和异常都来自throwable,但只是捕获异常不会捕获错误。然而,错误通常非常严重,如果不是不可能从查看中恢复,则很难。 When to catch java.lang.Error?

答案 2 :(得分:4)

是的,您可以在catch块中启动一个线程。

但是,如果您收到OutOfMemoryError,则可能无法启动线程。 OutOfMemoryError意味着你的堆空间不足,并且所有线程都使用相同的堆空间(事实上,创建一个新线程将耗尽你已经减少的一些堆)。

答案 3 :(得分:1)

您不需要迭代每个值来解决基于collat​​z猜想的问题。我假设您正在尝试计算每个值。这是我试过的方法,但是遇到了同样的事情(尽管我使用的是.net)。

我不想试图解决技术问题,而是建议您改变方法。

注意:我意识到,我假设(没有理由),你正在尝试解决ProjectEuler.net问题(或类似问题)。如果不是这种情况,我的解决方案可能不可行。

答案 4 :(得分:-1)

是的,

在catch块中启动线程没有限制。但是,捕获异常时的正常行为是向用户显示,记录,反而抛出另一个异常,关闭应用程序。

正如其他人所说,在你的情况下,你试图捕获一个java.lang.Error,这不是一个Exception,并且你没有下一行代码执行的保证。