是什么让Java崩溃并跳过try catch块?

时间:2013-05-08 01:00:04

标签: java android corona

我在使用Corona SDK时遇到了一些问题,他们的Android编码器声称该错误是在Java或Android中拒绝捕获异常而是崩溃。

我之前从未听说过,所以,如果他们说的是真的,可以纠正吗?

特别是我的问题:http://forums.coronalabs.com/topic/34688-how-i-load-a-16-bit-image

总结:

我正在尝试使用Corona SDK加载2048x2048图像。我可以用Marmalade SDK和原生Java做到这一点,但是使用Corona它会在Android 2.3上的Nexus One和Xperia Play(以及可能还有许多其他未经测试的设备)崩溃

我向他们提交了一个错误报告,他们的答复是他们有很多依赖于Java代码上的try catch块的回退,但是在崩溃的设备上,它会崩溃而不是触发catch块,或者它默默地失败并完全跳过catch块。

我想知道如何解决这个问题(崩溃或跳过而不是触发catch块)

1 个答案:

答案 0 :(得分:4)

首先,这不是Java(TM)问题。这是Android问题,与以下一项或多项有关:

  • 通用Android平台(不太可能)
  • 您手机的Android特定端口,或
  • 第三方原生代码扩展程序。

如果问题是(Davlik)VM崩溃的结果,那么在触发问题后,您的应用程序无法执行任何操作。当DVM崩溃时,那就是“游戏结束”。没有例外。实际上,在重新启动之前不会再执行Java代码。

当VM自身进入无法安全继续的状态时,DVM(和JVM)仅崩溃。通常,您会遇到某种内存损坏或触发硬件异常(segvs,非法指令等)。普通的纯Java代码无法实现这一点......除非存在平台错误。本机代码可以实现它。

谁是如此责备?

  • 如果Corona包含本机代码库,则可能是它们的错误。否则不是。 (如果他们的代码是“纯粹的”Java代码并且发生VM崩溃,则他们不会导致它并且无法从中恢复。请参阅上文。)
  • 如果您有其他第三方本机代码处于活动状态,那可能是罪魁祸首。
  • 否则,故障很可能出现在您设备的Android特定端口中。

你可以做什么?

  • 检查Corona是否包含本机代码库。
  • 尝试在制造商的网站上查找错误报告和修复或解决方法。 (听起来这可能是垃圾收集区域中的一个错误,但崩溃转储中应该有更多线索。)
  • 获取更新的手机。可悲的是,许多无线电话网络都没有为旧款Android手机提供及时更新...如果你相信这一点:http://arstechnica.com/security/2013/04/wireless-carriers-deceptive-and-unfair/
  • 抱怨。它可能没有帮助,但它可能会让你感觉更好: - )

工作量可能是增加应用程序的堆分配(如果可能的话)或修改应用程序的工作方式,以便它不会尝试将大图像加载到内存中走。让我们面对它,Android手机没有大量的内存,并且堆的最大大小限制了应用程序可以做的事情。大图像需要很多堆空间。

<强>更新

鉴于您提供的额外背景,我认为解决方法最好。只是不要尝试加载巨大的图像。找另一种方式。