我正在开发一个应用程序,每次运行它时,我都会收到这样的消息:

不幸的是,MyApp已停止。

我可以做什么来解决这个问题?


关于这个问题-显然是受什么是堆栈跟踪以及如何使用它调试应用程序错误的启发?,有很多问题表明他们的应用程序已经崩溃,没有任何进一步的细节。这个问题旨在指导Android新手程序员如何自己解决问题,或者提出正确的问题。


当前回答

检查Logcat消息并查看Manifest文件。应该缺少定义“活动”、“用户权限”等内容。

其他回答

只有当代码中出现致命异常,停止应用程序的执行时,才会显示此弹出窗口。它可以是任何异常NullPointerException、OutOfMemoryException等。

最好的检查方法是通过Logcat,如果您仍在Android studio中开发应用程序,这是快速读取堆栈跟踪并检查应用程序原因的方法。

如果你的应用已经上线,那么你就不能使用logcat。因此,您可以实现Crashlytics,为您提供任何异常的错误报告。

你必须检查堆栈跟踪

如何做到这一点?

在IDE上检查窗口窗体LOGCAT

如果你看不到原木色的窗户,就去这条路打开它

window->show view->others->Android->Logcat

如果您正在使用Google Api,请转到以下路径

adb logcat>logcat.txt

注意:此答案使用Android Studio 2.2.2

注2:我正在考虑您的设备是否已成功连接。


当应用程序崩溃时,首先要做的是查看LogCat,在Android Studio的底部有一个带有菜单列表的工具栏:

单击“Android监视器”(我在上图中画了下划线的监视器。^)

现在,你会得到这样的结果:

将“Verbose”更改为“Error”现在它只会显示记录的错误。现在不要担心所有这些错误(如果你有)。

好的。现在,做你所做的,让你的应用崩溃。应用程序崩溃后,转到日志。例如,您应该找到一个新的崩溃日志,其中包含大量的:x.x.x:和由:TrumpIsPresidentException引起的异常。转到日志中的“引起原因:”语句。

在“引发者:”旁边,应该有发生的异常。在我的例子中,这是一个RuntimeException,在它下面应该有一行包含蓝色链接,例如:

如果这是由:没有一行下面有蓝色文本,那么寻找另一个由:有。

单击蓝色链接。它会把你带到问题发生的地方。在我的案例中,这是因为这句话:

throw new RuntimeException();

所以,现在我知道它为什么会崩溃了。这是因为我自己在抛出例外。这是一个明显的错误。


然而,假设我又犯了一个错误:

java.lang.NullPointerException

我检查了我的日志,我点击了它给我的蓝色链接,它把我带到了这里:

mTextView.setText(myString);

所以,现在我要调试。根据StackOverflow问题,NullPointerException表示某个内容为空。

那么,让我们来看看什么是空的。有两种可能性。mTextView为空,或myString为空。为了找到答案,在mTextView.setText(mString)行之前,我添加了以下两行:

Log.d("AppDebug","mTextView is null: " + String.valueOf(mTextView == null);
Log.d("AppDebug","myString is null: " + String.valueOf(myString== null);

现在,就像我们之前所做的那样(我们将Verose更改为Error),我们希望将“Error”更改为“Debug”。因为我们是通过调试进行日志记录的。以下是所有Log方法:

Log.
  d means Debug
  e means error
  w means warning
  v means verbose
  i means information
  wtf means "What a terrible failure". This is similar to Log.e

因此,由于我们使用了Log.d,我们正在检查Debug。这就是我们将其更改为调试的原因。

注意Log.d有第一个参数,在我们的例子中是“AppDebug”。单击logcat右上角的“无过滤器”下拉菜单。选择“编辑过滤器配置”,为过滤器命名,然后在“日志标记”中输入“应用程序调试”。单击“确定”。现在,您应该在日志中看到两行:

yourPackageNameAndApp: mTextView is null: true
yourPackageNameAndApp: myString is null: false

现在我们知道mTextView为空。

我观察我的代码,现在我注意到了一些东西。

我在类的顶部声明了私有TextView mTextView。但是,我没有定义它。

基本上,我忘记在onCreate()中执行此操作:

mTextView = (TextView) findViewById(R.id.textview_id_in_xml);

所以这就是mTextView为空的原因,因为我忘记告诉我的应用程序它是什么。所以我添加了那行,运行我的应用,现在应用程序不会崩溃。


此答案描述了检索堆栈跟踪的过程。已经有堆栈跟踪了吗?阅读“什么是堆栈跟踪,如何使用它调试应用程序错误?”中的堆栈跟踪

问题

应用程序退出,因为引发了未捕获的RuntimeException。其中最常见的是NullPointerException。

如何解决?

每当Android应用程序(或任何Java应用程序)崩溃时,堆栈跟踪都会写入控制台(在本例中为logcat)。此堆栈跟踪包含解决问题的重要信息。

Android工作室

在窗口的底部栏中,单击Logcat按钮。或者,您可以按alt+6。确保在“设备”面板中选择了仿真器或设备。接下来,尝试查找以红色显示的堆栈跟踪。可能有很多内容登录到logcat中,因此您可能需要滚动一点。找到堆栈跟踪的一个简单方法是清除logcat(使用右侧的回收站),然后让应用程序再次崩溃。

我找到了堆栈跟踪,现在呢?

耶!你的问题已经解决了一半。您只需要通过分析堆栈跟踪来找出应用程序崩溃的原因。

阅读“什么是堆栈跟踪,如何使用它调试应用程序错误?”中的堆栈跟踪

我仍然无法解决我的问题!

如果您找到了异常及其发生的行,但仍然无法确定如何修复它,请不要犹豫,在StackOverflow上提问。

尽量简洁:发布堆栈跟踪和相关代码(例如,在引发异常的行之前的几行)。

使用LogCat并尝试查找导致应用程序崩溃的原因。

如果您使用Android Studio,请按ALT+6查看Logcat或

如果您使用Eclipse,那么窗口->打开透视->其他-LogCat

转到LogCat,从下拉菜单中选择错误。这将包含帮助您调试所需的所有信息。如果这没有帮助,发布LogCat作为对您问题的编辑,有人会帮助您解决问题。