我可能会遗漏一些东西,但每当在Android(或java)中抛出异常时,我的应用程序总是强制关闭,整个程序终止。但是当数据库查询出现问题时,我只想返回主菜单。
try {
database.query(params);
} catch (Exception e) {
Log.e("Game", "Failed Loading Level", e);
returnToMenu();
}
}
这例如强制关闭了我的程序,我只想让它继续!
答案 0 :(得分:7)
所有Android开发人员在开发应用程序时都必须面临强制关闭问题。 这是一种捕获该错误并优雅地处理它的方法。
这将在你的android应用程序中创建一个错误页面类型的机制。所以每当你的应用程序崩溃时,用户将无法看到这个恼人的弹出对话框。而不是该应用程序将向用户显示预先显示的视图。
为了建立这样的机制,我们需要创建一个错误处理程序和一个Activity类,它将在应用程序被强制关闭时获得视图。
import java.io.*;
import android.content.*;
import android.os.Process;
public class ExceptionHandler implements java.lang.Thread.UncaughtExceptionHandler {
private final Context myContext;
public UncaughtExceptionHandler(Context context) {
myContext = context;
}
public void uncaughtException(Thread thread, Throwable exception) {
StringWriter stackTrace = new StringWriter();
exception.printStackTrace(new PrintWriter(stackTrace));
System.err.println(stackTrace);
Intent intent = new Intent(myContext, CrashActivity.class);
intent.putExtra(BugReportActivity.STACKTRACE, stackTrace.toString());
myContext.startActivity(intent);
Process.killProcess(Process.myPid());
System.exit(10);
}}
上面的类将作为强制关闭错误的监听器。您可以看到Intent和startActivity用于在应用崩溃时启动新的Activity。因此,只要应用程序崩溃,它就会启动名为CrashActivity的活动。现在我已经将堆栈跟踪作为intent的附加内容传递。
现在因为CrashActivity是一个规范的Android Actitvity,你可以用任何你想要的方式处理它。
现在是重要的部分,即如何捕获该异常。 虽然很简单。在覆盖onCreate方法中调用super方法之后,复制每个Activity中的以下代码行。
Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler(this));
您的活动可能看起来像这样......
public class ForceClose extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler(this));
setContentView(R.layout.main);
// Your mechanism is ready now.. In this activity from anywhere if you get force close error it will be redirected to the CrashActivity.
}}
您可以从此链接下载zip文件
http://trivedihardik.wordpress.com/2011/08/20/how-to-avoid-force-close-error-in-android/
答案 1 :(得分:0)
如果已实现onSaveInstanceState()和onRestoreInstanceState(),则可以将CrashActivity.class替换为导致崩溃的活动。请参阅http://developer.android.com/reference/android/app/Activity.html。
答案 2 :(得分:0)
我遇到了类似的问题,最终显示在此页面上,因为我不明白为什么我的应用程序没有捕获我抛出的异常。事实证明,这是有明显原因的,所以我会分享。
就我而言,我有一些代码正在从HTTPS请求接收JSON数据。这导致编译器发牢骚,我不得不对解析JSON的代码进行尝试/捕获。到目前为止,一切都很好。
JSON包含自定义格式的版本字符串,我想将该版本字符串与应用程序连接到的设备上的固件版本进行比较。因此,我创建了一个使用版本字符串并将其解析为各种组件的类,然后以特定顺序使用它们进行比较。在将字符串解析为组件的构造函数中,如果字符串无效,则会抛出异常。再次,这很好而且完全正常。
从事固件工作的人告诉我我的应用程序崩溃。好的-要弄清楚原因。原来他们在固件中放入了无效的版本字符串。没关系。应该发生的是,Version类抛出了一个异常,该异常被我的try / catch捕获,并且仅阻止了与版本比较有关的逻辑,并且在这种(异常)情况下,它不会显示可用的固件更新。 / p>
绞尽脑汁弄清楚为什么未捕获到异常后,我终于弄清楚了这是因为我的try / catch捕获了JSONException而我的Version类抛出了RuntimeException。
因此,如果您不知道为什么try / catch没有捕获到异常,您认为应该捕获该异常并最终结束,请仔细检查要处理的异常类型并确保您拥有适当的异常捕获的类型。