为什么要避免使用System.exit()?

时间:2011-11-29 01:03:09

标签: java blackberry java-me

我正在阅读Anthony Rizk的书“开始黑莓开发”,虽然System.exit()方法将退出应用程序,但建议通过关闭所有屏幕来避免这种情况并通过关闭所有屏幕来正确清理应用程序。我的问题是,为什么要避免System.exit()

4 个答案:

答案 0 :(得分:6)

这是一个非常有趣的问题!

Java SE API和BB Java API的System.exit()行为有所不同:

  • 在Java SE API中:终止当前运行的 Java虚拟机
  • 在BB Java API中:终止当前运行的 Java应用程序

另请查看Carol Hamer和Andrew Davison在“学习黑莓游戏开发”中对此有何看法:

  

警告:BlackBerry平台无法在单独的虚拟环境中启动您的应用程序   机器,这意味着你必须非常小心清理。一个人的遗体   较早运行(例如静态变量和仍在内存中的其他数据)可能会影响应用程序的后续运行。它还意味着有一个全局命名空间,因此如果两个类具有相同的名称,则可能会出现错误。

所以,是的,每个BB设备都有唯一的JVM。是的,在BB应用程序中,System.exit()调用只会停止您的应用程序,将所有静态数据留在RAM中,除非您进行初步清理

所以你不应该避免System.exit() - 这是一个合法/正确的方式来关闭BB应用程序,但只是在此次调用之前进行任何清理

<强>更新

糟糕!我创建了一个测试应用程序(使用JDE 4.7.0 + Storm 9530 4.7.0模拟器)来测试System.exit()调用后静态内容是否真的保留在RAM中。事实证明,它不会再呆在那里了。下次进入应用程序时,静态变量为空(正如我们所期望的那样,它们在Java SE中)。因此,我不清楚Carol Hamer和Andrew Davison的意思是什么“早期运行的遗留物(例如静态变量和其他数据仍在内存中)可能会影响应用程序的后续运行”

答案 1 :(得分:2)

这是因为它可能会使您自己的有序退出方法短路,例如:刷新缓冲的输出流/写入器,记录会话,删除文件,提交DBMS事务,......

答案 2 :(得分:1)

根据我的理解,通过调用System.exit()来杀掉容器是不正确的。正确的方法是创建某种类型的destroy()方法,该方法允许清理线程并关闭已打开的任何资源。

用外行的术语来说,System.exit()可能会留下挥之不去的数据/会话信息。

答案 3 :(得分:0)

根据我对BB开发的记忆,System.exit()只关闭应用程序而不破坏您创建的对象,将它们留给垃圾收集器。因此,应用程序将无法从内存中有效删除。逐个关闭屏幕实际上会解除分配。

我可能对细节有所了解,但有足够的关于网络上最佳实践的信息:)

相关问题