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

6

我正在阅读安东尼·里兹克(Anthony Rizk)的书《初学者黑莓开发》,他提到虽然 System.exit() 方法可以退出应用程序,但建议避免使用该方法,在退出时通过关闭所有屏幕来正确清理应用程序。我的问题是,为什么要避免使用 System.exit()

4个回答

6

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

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

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

此外,请查看Carol Hamer和Andrew Davison的“Learn Blackberry Games Development”中对此的解释:

注意: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所说的“之前运行的残留物(例如仍然在内存中的静态变量和其他数据)可能会影响应用程序的后续运行”,我并不清楚他们的意思。


2

这是因为它可能会破坏你自己的有序退出方法,例如清空缓冲输出流/写入器、注销会话、删除文件、提交数据库事务等。


将其作为最后一条指令调用,在清理完毕后,被认为是正确的吗?(我通常这样做,这样可以避免逐个迭代堆栈中的屏幕)。 - Mister Smith

1
据我理解,通过调用System.exit()来终止容器是不正确的。正确的方法是创建一个destroy()方法,以便清理线程并关闭任何已打开的资源。
简单来说,使用System.exit()可能会留下残留数据/会话信息。

0

从我对BB开发的记忆中,System.exit()只是关闭应用程序而不会销毁您创建的对象,这些对象将留给垃圾收集器。因此,该应用程序实际上不会从内存中有效地删除。逐个关闭屏幕实际上会释放它们。

我可能在细节上有点偏差,但网络上有足够的关于最佳实践的信息 :)


1
不正确。应用程序已从内存中删除。当进程退出时,所有内存都会释放给操作系统。所有系统资源也将被释放到操作系统中,包括fds、 窗口、套接字等。我上次使用不符合该情况的操作系统是在1994年左右。 - user207421
1
当你谈论操作系统时,你是正确的;但当你谈论Java虚拟机时,你是错误的。 - favoretti
那也是我的想法。虽然我已经有一段时间没有做BB编程了,而且EJP非常自信,我只好闭嘴 :) - favoretti
@Arhimed: 嗯,如果它们被null了,这并不意味着它们被销毁了,对吧?它们只是引用数量为0,所以下一个GC运行应该会从堆中回收它们。或者我现在完全疯了吗? - favoretti
@favoretti:我也考虑过这个问题,也许句柄被置空了,但对象本身仍然存在,等待GC调用。然而,由于在BB API中Object没有finalize(),因此无法编写代码来测试这一点。 - Vit Khudenko
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接