为什么Android应用程序在运行时异常后会自动重新启动?

3

我的应用在两个5.0安卓系统上运行。

在我的开发中,我遇到了一个未捕获的RuntimeException异常。

当遇到这个异常时,我的应用程序会自动重启,

我不知道为什么我的应用程序会自动重启?即使我调用 System.exit(1)

这是带有RuntimException的日志。

E/AndroidRuntime(23905): FATAL EXCEPTION: main
E/AndroidRuntime(23905): Process: com.oosmart.mainapp, PID: 23905
E/AndroidRuntime(23905): android.database.sqlite.SQLiteException: no such table: devices (code 1): , while compiling: drop table devices
E/AndroidRuntime(23905):    at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
E/AndroidRuntime(23905):    at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889)
E/AndroidRuntime(23905):    at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500)
E/AndroidRuntime(23905):    at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
E/AndroidRuntime(23905):    at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
E/AndroidRuntime(23905):    at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
E/AndroidRuntime(23905):    at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1674)
E/AndroidRuntime(23905):    at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1655)
E/AndroidRuntime(23905):    at com.oosmart.mainaplication.db.DBOperation.execute(DBOperation.java:81)
E/AndroidRuntime(23905):    at com.oosmart.mainaplication.db.DevicesDB.dropTable(DevicesDB.java:154)
E/AndroidRuntime(23905):    at com.oosmart.mainaplication.db.DBHelper.DropTable(DBHelper.java:30)
E/AndroidRuntime(23905):    at com.oosmart.mainaplication.fragment.UserCenterFragment.onExitClick(UserCenterFragment.java:128)
E/AndroidRuntime(23905):    at com.oosmart.mainaplication.fragment.UserCenterFragment$$ViewBinder$6.doClick(UserCenterFragment$$ViewBinder.java:74)
E/AndroidRuntime(23905):    at butterknife.internal.DebouncingOnClickListener.onClick(DebouncingOnClickListener.java:22)
E/AndroidRuntime(23905):    at android.view.View.performClick(View.java:4806)
E/AndroidRuntime(23905):    at android.view.View$PerformClick.run(View.java:19952)
E/AndroidRuntime(23905):    at android.os.Handler.handleCallback(Handler.java:739)
E/AndroidRuntime(23905):    at android.os.Handler.dispatchMessage(Handler.java:95)
E/AndroidRuntime(23905):    at android.os.Looper.loop(Looper.java:135)
E/AndroidRuntime(23905):    at android.app.ActivityThread.main(ActivityThread.java:5313)
E/AndroidRuntime(23905):    at java.lang.reflect.Method.invoke(Native Method)
E/AndroidRuntime(23905):    at java.lang.reflect.Method.invoke(Method.java:372)
E/AndroidRuntime(23905):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1116)
E/AndroidRuntime(23905):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:809)

这是带有System.exit的日志

I/AndroidRuntime(20479): VM exiting with result code 1, cleanup skipped.
I/AndroidRuntime(23172): VM exiting with result code 1, cleanup skipped.
I/Process (24461): java.lang.RuntimeException

我使用 Runtime 进行日志筛选。

更新: 即使我调用 android.os.Process.killProcess(android.os.Process.myPid());, 应用程序仍会以新的进程 ID 重新启动。 我不知道为什么无法在代码中完全退出。


1
可能是因为你没有完成之前的活动,当新活动创建异常时,它会关闭当前活动并打开之前的活动。如果我错了,请有人纠正我。 - Rakshit Nawani
是的,我还没有完成之前的活动,但即使我调用System.exit()运行时异常也不会崩溃应用程序吗? - user998953
展示一些代码以便更清晰地说明。 - Rakshit Nawani
您正在删除不存在的表格。请检查相关条件。 - Amit Vaghela
代码出现了正常的运行时异常,我将尝试在GitHub上发布一个新项目并包含相同的错误。 - user998953
显示剩余2条评论
2个回答

2

可能是因为你没有完成之前的活动,当新的活动创建异常时,它会关闭当前的活动并打开先前的活动,而运行时异常会导致应用程序崩溃,你试图删除甚至不存在的表格,即使系统.exit()也无法退出应用程序。最佳实践是在使用任何复杂编码时使用try catch。

如果我有错误,请纠正我。


System.exit() 在第一个 Activity 中可以正常工作,但我不明白为什么 Runtime Exception 不会崩溃应用程序,或者即使崩溃了也会自动启动前一个 Activity。 - user998953

1

当出现错误时,我的所有应用程序都会重新启动,似乎这在Android Studio中发生。您应该尝试捕获SQLiteException以停止崩溃,然后可以调用finish()退出活动。


谢谢,我只是困惑为什么我的应用程序即使我调用“kill pid”也无法完全退出,并出现了“运行时异常”。 - user998953

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