不幸的是,MyApp停止了。我该如何解决这个问题?

java android debugging kotlin crash


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

遗憾的是,MyApp已经停止了。

有什么办法可以解决这个问题?


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




Answer 1 nhaarman


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

问题所在

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

如何解决?

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

安卓工作室

Finding the stack trace in Android Studio

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

我找到了栈道的痕迹,现在呢?

好啊!你的问题已经解决了一半了。
你只需要通过分析堆栈跟踪,找出到底是什么让你的应用崩溃。

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

我还是没能解决我的问题!

如果您已经找到了 Exception 及其发生的行,但是仍然想不出解决方法,请随时在StackOverflow上提问。

尽量简明扼要:发布堆栈跟踪和相关代码(例如,在抛出 Exception 的行之前增加几行)。




Answer 2 Vlad Bezden


您可以使用Google的ADB工具获取 Logcat file 来分析问题。

adb logcat > logcat.txt

打开 logcat.txt 文件并搜索您的应用程序名称。应该有关于失败原因,行号,类名等的信息。




Answer 3 Hiren Vaghela


首先,您检查您的应用崩溃了的那一点( Unfortunately, MyApp has stopped. )。为此,可以使用 Log.e("TAG", "Message"); ,使用此行,您可以在logcat中看到您的应用程序日志。

之后,你发现你的APP停止了哪一点,在你的身边很容易解决。




Answer 4 Rahil Ali


只要检查一下日志猫中的错误就可以了。

你可以从eclipse中获得日志猫选项。

窗口->显示视图->其他-> Android-> Logcat

Log cat包含错误。

另外,你也可以通过在调试模式下执行应用程序来检查错误。首先设置断点,然后再做。

右键单击项目->调试为-> Android应用程序




Answer 5 Ab_


注意:此答案使用的是Android Studio 2.2.2

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


当你的应用程序崩溃时,你要做的第一件事就是查看LogCat,在Android Studio的底部有一个工具栏,上面有一个菜单列表。

image

点击 "安卓监控器"(我在上图中下划线的那个)。

现在,你会得到这样的东西。

image

将“ Verbose ” 更改为“ Error ”,现在它将仅显示记录的错误。现在就不必担心所有这些错误(如果有)。

image

好。现在,执行崩溃应用程序的操作。应用崩溃后,转到日志目录。例如,您应该找到一个新的崩溃日志,其中有很多 at:x.x.x :,并且 Caused by: TrumpIsPresidentException 。转到您的logcat 中的 Caused by: 语句。

image

下一步,Caused By: ,应该是发生了异常。就我而言,这是一个 RuntimeException在它的下面应该有一行,其中包含一个蓝色链接,例如:

image

如果是 Caused by: 原因引起的:在其下的某处没有一行带有蓝色文本的行,然后查找另一 Caused by: 原因引起的:那样。

单击该蓝色链接。它应该带您到发生问题的位置。就我而言,这是由于以下原因:

throw new RuntimeException();

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


然而,让我们说我又出错了。

java.lang.NullPointerException

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

mTextView.setText(myString);

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

因此,让我们找出什么是null。有两种可能性。无论 mTextView 为空,或者 myString 的为空。为了找出 mTextView.setText(mString) ,在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.
  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右上方的“无过滤器”下拉菜单。选择“编辑过滤器配置”,为过滤器命名,然后在“日志标签”中输入“应用程序调试”。点击“确定”。现在,您应该在logcat中看到两行:

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

所以现在我们知道mTextView是空的。

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

我在班级顶部声明了 private TextView mTextView 。但是,我没有定义它。

基本上我忘了在我的onCreate()中这样做了。

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

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