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

Unfortunately MyApp has stopped. How can I solve this?

提问人:nhaarman 提问时间:4/29/2014 最后编辑:Braiamnhaarman 更新时间:12/26/2022 访问量:552039

问:

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

不幸的是,MyApp已停止。

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


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

java android 调试 kotlin

评论

31赞 laalto 5/18/2014
我已经看到很多问题被当作这个的骗子而关闭。这是一个很好的参考,可以帮助人们在问题中发布相关数据。然而,这并不是任何根本问题的重复,而只是挖掘根本问题的方法。我认为最好只是提供这个问题的链接作为参考,而不是作为重复关闭。
39赞 nhaarman 5/20/2014
我认为关闭功能非常适合此。这些问题中的大多数都表明对基本调试技能知之甚少。搁置它们为他们提供了一个机会,使用答案中所述的方法澄清他们的问题。更好的是,他们可能能够自己解决问题。不过,这个讨论可能更适合 meta.stackoverflow.com。
2赞 Chris Halcrow 10/30/2015
这个问题太模糊了。一个更好的问题是“使用 [myIDE] 如何调试”显示错误“不幸的是,MyApp 已停止”的 Android 应用程序
9赞 nhaarman 10/30/2015
@ChrisHalcrow 本问答与调试无关。它是关于指导 Android 初学者如何处理应用程序崩溃。

答:

776赞 10 revs, 4 users 77%nhaarman #1

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

问题

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

如何解决?

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

Android Studio的

Finding the stack trace in Android Studio

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

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

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

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

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

如果您已经找到了发生这种情况的行,但仍然无法弄清楚如何修复它,请随时在 StackOverflow 上提问。Exception

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

评论

42赞 Marco Acierno 6/14/2014
我知道这篇文章很旧:但是如果您使用 IntelliJ IDEA,您可以进入并添加一个新的过滤器 (i.imgur.com/145dtkx.png),并过滤它,您可以在此处放置 (i.imgur.com/HpELhaU.png),因此您可以在此框中读取您的应用程序抛出的所有内容。有了这个,你就不需要清除logcat并再次崩溃了。我认为Android Studio也有这个选项。Android > Devices|Logcatby Log MessageFATAL EXCEPTIONExceptions
1赞 Stephane 3/21/2015
在 Eclipse 中过滤 logcat 可以通过在过滤器的应用程序名称字段中输入 java 包名称来完成。
0赞 DooMMasteR 8/19/2015
我认为重点是了解异常发生时的回溯。当没有回溯或没有可用的 FC 时,FC 有点糟糕,这就是它变得毛茸茸的地方。但我认为这个解释是查找/识别此类错误的一个很好的第一个介绍。
4赞 Marian Paździoch 9/8/2015
当您的 logcat 有一些错误痕迹时,事情很容易,但是万一 logcat 什么都没有怎么办?stackoverflow.com/questions/32455645/......
4赞 Hilal 3/10/2017
问题是该行不包含堆栈跟踪写入和指向的错误。
45赞 Hiren Vaghela 3/18/2015 #2

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

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

7赞 Pelpotronic 3/22/2015 #3

您也可以单独收到此错误消息,而无需任何堆栈跟踪或任何进一步的错误消息。

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

评论

4赞 CommonsWare 4/29/2015
如果您可以上传一个演示这种现象的项目,我将很感兴趣。
132赞 Vlad Bezden 3/23/2015 #4

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

adb logcat > logcat.txt

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

评论

0赞 Jerod Venema 10/11/2015
这很棒,即使调试器无法捕获它,它也会快速显示设备上发生的任何情况,如果运行时无法加载,Xamarin 可能会发生这种情况。
1赞 Yannick 10/31/2015
我看不出为什么我的应用程序在 android studio logcat 中崩溃,根本没有错误。这个答案给了我我需要的东西。然而,后来我意识到我在工作室 logcat 中打开了一些过滤器,这使我无法看到错误。我切换回“仅显示选定的应用程序”,然后我恢复正常运行。
1赞 Karakuri 12/6/2016
您应该添加 ,否则您转到 ctrl-C 以退出 logcat。我愿意-dadb logcat -v time -d > filename.txt
36赞 Rahil Ali 6/11/2015 #5

只需检查log cat中的错误即可。

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

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

日志猫包含错误。

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

右键单击 project->debug as->Android 应用程序

20赞 Manoj ahirwar 6/29/2015 #6

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

13赞 alireza amini 7/13/2015 #7

您必须检查Stack trace

怎么做呢?

在 IDE 上检查 Windows 窗体 LOGCAT

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

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

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

adb logcat > logcat.txt

17赞 Shiv Buyya 11/3/2015 #8

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

  1. adb 日志猫

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

  3. eclipse logcat(如果在 eclipse 中不可见,请转到 Windows->显示视图->其他->Android->LogCat)

  4. Android 调试监视器或 Android 设备监视器(键入命令监视器或通过 UI 打开)

enter image description here

  1. Android Studio的

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

9赞 Biswajit Karmakar 5/15/2016 #9

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

如果您使用 Android Studio,要查看 Logcat,请按 Alt + 6

如果您使用 Eclipse,则 Window -> Open Perspective -> Other - LogCat

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

12赞 guipivoto 7/14/2016 #10

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

文档

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

这是 Android 关于 logcat 的页面

如果您使用 android Studio,您还可以查看此链接

捕获

基本上,您可以使用以下命令手动捕获 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

空指针异常错误

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

您尝试从对象调用方法。但是,那个对象是你做的时候。onBackPressed()FragmentActivitynull

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

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

文件中发生错误,在行的方法中:(stacktrace 显示发生错误的行)com.example.khan.abc.AudioFragment.javaonClick()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)

等。。。。

概述

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

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

34赞 Ali Bdeir 11/6/2016 #11

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

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


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

image

单击“Android Monitor”(我在上图中下划线的那个。

现在,你会得到如下内容:

image

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

image

还行。现在,执行导致应用程序崩溃的操作。应用崩溃后,转到 logcat。例如,您应该找到一个新的崩溃日志,其中包含大量 : 和。转到 logcat 中的该语句。at:x.x.xCaused by: TrumpIsPresidentExceptionCaused by:

image

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

image

如果这是由以下原因引起的:没有一行在它下面某处有蓝色文本,然后寻找另一行。Caused by:

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

throw new RuntimeException();

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


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

java.lang.NullPointerException

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

mTextView.setText(myString);

所以,现在我想调试。根据这个 StackOverflow 问题,NullPointerException 表示某些东西是 .null

那么,让我们找出什么是空。有两种可能性。要么是 null,要么是 null。为了找出答案,在行之前,我添加了以下两行:mTextViewmyStringmTextView.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

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

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

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

所以现在我们知道 mTextView 是 null。

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

我已经在班上名列前茅。但是,我没有定义它。private TextView mTextView

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

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

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


评论

1赞 EJoshuaS - Stand with Ukraine 5/18/2018
这是很好的信息,但使用堆栈跟踪的图像会降低其实用性 - 图像无法搜索,无法复制和粘贴,屏幕阅读器无法拾取,并且更难阅读。(顺便说一句,我没有投反对票,只是指出了这一点)。
12赞 Mayank Nema 4/3/2017 #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();
}
23赞 Ani 7/4/2017 #13

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

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

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

8赞 felislynx.silae 10/2/2017 #14

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

6赞 Kopi Bryant 5/20/2018 #15

人们会犯错误,编码也会出错。

当发生任何事情时,请务必使用红色文本与 logcat 核对,但是您可以在蓝色文本中找到真正的问题,并在这些红色文本中带有下划线error

确保如果创建一个新的,请始终在文件中声明。activityactivityAndroidManifest

如果添加 Permission,请在文件中声明它。AndroidMainifest

6赞 naXa stands with Ukraine 9/11/2018 #16

开发过程中崩溃

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

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

在野外坠毁

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

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

6赞 Ashish 3/26/2019 #17

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

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

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

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

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

要解决应用崩溃错误,请执行以下操作:

  • 请记住以上几点并仔细阅读。
  • 出现错误后,您将获得蓝色的文件名(单击它们并从发生错误跳转到代码)。
4赞 Mehul Solanki 5/22/2019 #18

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

之后,您会发现您的应用程序已停止从您的点修复该点。

5赞 zapotec 6/12/2019 #19

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

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

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

3赞 Mohsen Emami 3/16/2020 #20

此外,在终端中运行此命令可以帮助查找问题:

gradlew build > log.txt 2>details.txt

然后,您应该转到读取上述两个日志文件中的gradlew文件位置。

-3赞 Kleysley 6/4/2021 #21

如果您的应用崩溃且没有任何错误,并且您没有使用资产管理器,而是加载了如下纹理:

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

那么这就是问题所在。我有过这样的经历。您应该始终使用资产管理器来避免内存过载。

评论

0赞 Kleysley 2/14/2022
@MohammadBahadori OP 没有提供任何代码,我将如何发布特定的解决方案?“完整的解决方案”是使用资产管理,人们可以自己学习如何使用资产管理,有足够的指南。
3赞 rajeev ranjan 8/17/2021 #22

我会建议这样的事情。

  1. 检查您的手机是否有足够的空间让应用程序可以运行----prior/

  2. 当应用程序崩溃时检查 logcat。它将显示应用程序崩溃的确切行。

  3. 检查您是否在主线程上使用由于 ANR 而使用大量内存的东西。

2赞 samnoon 7/15/2022 #23

检查您的 Logcat 消息。此外,请参阅清单文件中缺少的元素,例如定义 、 等。ActivityUser permission

如果您使用 Android Studio,请按 alt+6

如果您使用 Eclipse,则 Window -> Open Perspective -> Other - LogCat

现在,从下拉菜单中选择错误。

或者,您可以使用 ADB 工具来分析问题。Logcat file

adb logcat > logcat.txt

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