852

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

不幸的是,MyApp 已停止。

我能做些什么来解决这个问题?


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

4

22 回答 22

760

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

问题

您的应用程序退出,因为RuntimeException抛出了未捕获的内容。
其中最常见的是NullPointerException.

如何解决?

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

安卓工作室

在 Android Studio 中查找堆栈跟踪

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

我找到了堆栈跟踪,现在怎么办?

耶!你已经解决了你的问题的一半。
您只需要通过分析堆栈跟踪来找出究竟是什么导致了您的应用程序崩溃。

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

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

如果你找到了你的Exception和它发生的那一行,但仍然无法弄清楚如何修复它,不要犹豫,在 StackOverflow 上提问。

尽量简洁:发布堆栈跟踪和相关代码(例如,几行直到抛出Exception.

于 2014-04-28T23:55:14.227 回答
127

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

adb logcat > logcat.txt

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

于 2015-03-22T23:06:52.597 回答
40

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

之后,您会发现您的应用程序停止了哪一点,这很容易在您身边解决。

于 2015-03-18T08:01:53.050 回答
31

只需检查 log cat 中的错误。

您可以从 eclipse 中获得 log cat 选项:

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

日志 cat 包含错误。

否则,您还可以通过在调试模式下执行应用程序来检查错误。首先通过以下方式设置断点:

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

于 2015-06-11T10:58:17.107 回答
30

注意:这个答案是使用 Android Studio 2.2.2

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


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

图片

点击“Android Monitor”(我在上图中划线的那个。^)

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

图片

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

图片

好的。现在,做你所做的让你的应用程序崩溃。在您的应用程序崩溃后,转到您的 logcat。您应该找到一个新的崩溃日志,其中包含很多at:x.x.x: 和Caused by: TrumpIsPresidentException例如。转到Caused by:您的 logcat 中的该语句。

图片

旁边Caused By:应该有发生的异常。在我的情况下,它是一个RuntimeException在它下面应该有一行包含一个蓝色链接,例如:

图片

如果它Caused by:下面的某处没有带有蓝色文本的行,那么请寻找另一个Caused by:

点击那个蓝色链接。它应该带你到问题发生的地方。就我而言,这是由于这条线:

throw new RuntimeException();

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


但是,假设我遇到了另一个错误:

java.lang.NullPointerException

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

mTextView.setText(myString);

所以,现在我想调试。根据这个 StackOverflow 问题,一个 NullPointerException 说某事是null

所以,让我们找出什么是 null。有两种可能。要么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 右上角的“No Filters”下拉菜单。选择“编辑过滤器配置”,为您的过滤器命名,然后在“日志标签”中输入“应用程序调试”。单击“确定”。现在,您应该在 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为空,因为我忘了告诉我的应用程序它是什么。所以我添加了那行,运行我的应用程序,现在应用程序不会崩溃。


于 2016-11-06T09:23:57.257 回答
21

此弹出窗口仅在您的代码中出现致命异常时才会显示,该异常会停止应用程序的执行。它可能是任何例外NullPointerExceptionOutOfMemoryException等等。

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

如果您的应用程序已经上线,那么您不能使用logcat。因此,为此,您可以实施Crashlytics以向您提供发生的任何异常的错误报告。

于 2017-07-04T04:38:18.863 回答
18

检查您的Logcat消息并查看您的Manifest文件。应该缺少一些东西,比如定义Activity,用户权限等等。

于 2015-06-29T11:48:47.430 回答
15

您可以使用以下任何工具:

  1. 亚行日志猫

  2. adb logcat > logs.txt(您可以使用编辑器打开和搜索错误。)

  3. eclipse logcat(如果在 eclipse 中不可见,转到 Windows->Show View->Others->Android->LogCat)

  4. Android Debug Monitor 或 Android Device Monitor(键入命令监视器或通过 UI 打开)

在此处输入图像描述

  1. 安卓工作室

我建议使用Android Debug Monitor,很好。因为当有太多日志时eclipse会挂起,并且通过adb logcat过滤器和所有困难。

于 2015-11-03T05:47:45.907 回答
13

你必须检查Stack trace

怎么做?

在您的 IDE 上检查 Windows 窗体 LOGCAT

如果您看不到 logcat 窗口,请转到此路径并打开它

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

如果您使用的是 Google-Api,请转到此路径

adb logcat > logcat.txt

于 2015-07-13T08:37:51.973 回答
12

让我分享一个基本的 Logcat 分析,当您遇到强制关闭(当应用程序停止工作时)。

文档

Android 收集/分析日志的基本工具是 logcat。

这里是关于 logcat 的 Android 页面

如果您使用 android Studio,您也可以查看此LINK

捕获

基本上,您可以使用以下命令手动捕获 logcat(或仅检查 AndroidStudio 中的 AndroidMonitor 窗口):

adb logcat

您可以将很多参数添加到命令中,以帮助您过滤和显示您想要的消息......这是个人的......我总是使用下面的命令来获取消息时间戳:

adb logcat -v time

您可以将输出重定向到文件并在文本编辑器中对其进行分析。

分析

如果您的应用程序正在崩溃,您将得到如下信息:

07-09 08:29:13.474 21144-21144/com.example.khan.abc D/AndroidRuntime: Shutting down VM
07-09 08:29:13.475 21144-21144/com.example.khan.abc E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.khan.abc, PID: 21144
    java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v4.app.FragmentActivity.onBackPressed()' on a null object reference
     at com.example.khan.abc.AudioFragment$1.onClick(AudioFragment.java:125)
     at android.view.View.performClick(View.java:4848)
     at android.view.View$PerformClick.run(View.java:20262)
     at android.os.Handler.handleCallback(Handler.java:815)
     at android.os.Handler.dispatchMessage(Handler.java:104)
     at android.os.Looper.loop(Looper.java:194)
     at android.app.ActivityThread.main(ActivityThread.java:5631)
     at java.lang.reflect.Method.invoke(Native Method)
     at java.lang.reflect.Method.invoke(Method.java:372)
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:959)
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:754)
07-09 08:29:15.195 21144-21144/com.example.khan.abc I/Process: Sending signal. PID: 21144 SIG: 9

这部分日志显示了很多信息:

  • 问题发生时:07-09 08:29:13.475

检查问题发生的时间很重要...您可能会在日志中发现几个错误...您必须确保您正在检查正确的消息:)

  • 哪个应用程序崩溃了:com.example.khan.abc

这样,您就知道哪个应用程序崩溃了(以确保您正在检查有关您的消息的日志)

  • 哪个错误:java.lang.NullPointerException

NULL 指针异常错误

  • 有关错误的详细信息:Attempt to invoke virtual method 'void android.support.v4.app.FragmentActivity.onBackPressed()' on a null object reference

您试图onBackPressed()FragmentActivity对象调用方法。但是,那个对象是null你做它的时候。

  • 堆栈跟踪:堆栈跟踪向您显示方法调用顺序...有时,错误发生在调用方法中(而不是在被调用方法中)。

    在 com.example.khan.abc.AudioFragment$1.onClick(AudioFragment.java:125)

文件中发生错误com.example.khan.abc.AudioFragment.java,在onClick()方法内部行:125(stacktrace 显示发生错误的行)

它是由以下人员调用的:

at android.view.View.performClick(View.java:4848)

由以下人员调用:

at android.view.View$PerformClick.run(View.java:20262)

由以下人员调用:

at android.os.Handler.handleCallback(Handler.java:815)

ETC....

概述

这只是一个概述......并非所有日志都很简单,但错误给出了具体问题,详细显示了所有问题......这只是为了分享这个想法并为您提供入门级信息......

我希望我能以某种方式帮助你......问候

于 2016-07-14T03:21:35.653 回答
12

在下面的 showToast() 方法中,您必须通过这样做为上下文或应用程序上下文传递另一个参数,您可以尝试一下。

  public void showToast(String error, Context applicationContext){
        LayoutInflater inflater = getLayoutInflater();
        View view = inflater.inflate(R.layout.custom_toast, (ViewGroup)      
        findViewById(R.id.toast_root));
        TextView text = (TextView) findViewById(R.id.toast_error);
        text.setText(error);
        Toast toast = new Toast(applicationContext);
        toast.setGravity(Gravity.TOP | Gravity.FILL_HORIZONTAL, 0, 0);
        toast.setDuration(Toast.LENGTH_SHORT);
        toast.setView(view);
        toast.show();
}
于 2017-04-03T09:37:25.587 回答
9

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

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

如果你使用Eclipse然后 Window -> Open Perspective -> Other - LogCat

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

于 2016-05-15T07:45:20.753 回答
8

如果您的应用程序由于某种原因在没有良好堆栈跟踪的情况下崩溃。尝试从第一行调试它,然后逐行调试直到崩溃。然后你会有答案,哪条线给你带来麻烦。或许您可以将其包装到 try catch 块中并打印错误输出。

于 2017-10-02T15:07:36.693 回答
7

您也可以自行获取此错误消息,而无需任何堆栈跟踪或任何进一步的错误消息。

在这种情况下,您需要确保您的 Android 清单配置正确(包括从库发生的任何清单合并以及来自库的任何活动),并特别注意清单文件中应用程序中显示的第一个活动.

于 2015-03-22T08:50:58.587 回答
6

人们会犯错误,编码也是如此。

每当发生任何error事情时,请始终使用带有红色文本的 logcat 检查,但是您可以找出蓝色文本中带有下划线的红色文本中的真正问题。

确保如果你创建一个新的activity,总是activityAndroidManifest文件中声明。

如果添加权限,也要在AndroidMainifest文件中声明。

于 2018-05-19T17:24:20.810 回答
6

开发过程中崩溃

尝试我最喜欢的工具logview来获取日志并在开发过程中对其进行分析。
确保在 Linux 中运行时将./logview和标记为可执行文件。./lib/logview.jar

如果您不喜欢它,还有很多适用于 Android 的替代桌面日志查看器

在野外坠毁

集成实时崩溃报告工具,例如Firebase Crashlytics,以获取用户设备上发生的未处理异常的堆栈跟踪。

阅读如何发布一个有缺陷的应用程序(并且活生生地讲述这个故事),以了解更多关于在该领域处理错误的信息。

于 2018-09-11T08:35:14.223 回答
6

Logcat -检查 Android Studio 开发阶段的日志

最初清除 Logcat 并让应用程序再次崩溃,以便您只能获取崩溃的日志详细信息。您必须检查堆栈跟踪

不幸的是,MyApp 已经停止。有很多原因。您可以在日志中检查相同的内容。为此,您可以使用 Log.e("TAG","Message");

应用程序崩溃期间的常见错误,例如:

  1. 编码错误(错误使用关键字)。
  2. 不匹配的属性名称。
  3. 不支持的插件(可能)。
  4. 不匹配的版本(也许)。
  5. AndroidManifest 文件中缺少活动。
  6. AndroidManifest 文件中缺少权限。
  7. 最常见的 NullPointerException。
  8. 已声明但未定义。

要解决应用程序崩溃错误:

  • 请记住以上几点并通过它。
  • 出现错误时,您将获得蓝色的文件名(单击它们并跳转到发生错误的代码)。
于 2019-03-26T04:42:26.043 回答
4

首先,您需要检查应用程序崩溃的位置和原因(Unfortunately, MyApp has stopped.).在 的帮助下LOG,您可以找出问题所在。

之后,您会从您的角度找到您的应用停止修复的点。

于 2019-05-22T10:40:39.907 回答
4

如果您的终端中没有任何有趣的日志(或者它们与您的应用程序没有直接关系),那么您的问题可能是由于本机库造成的。在这种情况下,您应该检查终端中的“墓碑”文件。

墓碑文件的默认位置取决于每个设备,但如果是这种情况,您将有一个日志告诉您:Tombstone written to: /data/tombstones/tombstone_06

有关更多信息,请查看https://source.android.com/devices/tech/debug

于 2019-06-12T13:07:32.743 回答
2

在终端中运行此命令也可以帮助找到问题:

gradlew build > log.txt 2>details.txt

那么你应该去 gradlew 文件位置读取上面的两个日志文件。

于 2020-03-16T10:18:34.857 回答
1

我会提出类似以下的建议

1.检查您的手机是否有足够的空间来运行应用程序----之前/ 2.检查应用程序崩溃时的 logcat 它将显示崩溃的确切行 3.检查您是否在使用大量的主线程上使用某些东西内存由于 ANR 它正在发生。

于 2021-08-17T07:55:58.900 回答
-2

如果您的应用程序在没有任何错误的情况下崩溃,并且您没有使用资产管理器但加载了如下纹理:

Texture texture = new Texture("myImage.png"); //dont to this all the time

那么这就是问题所在。我也遇到过这种情况。您应该始终使用资产管理器来避免内存过载。

于 2021-06-04T08:13:32.977 回答