【问题标题】:Unfortunately MyApp has stopped. How can I solve this?不幸的是,MyApp 已停止。我该如何解决这个问题?
【发布时间】:2019-04-23 15:57:44
【问题描述】:

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

很遗憾,MyApp 已停止。

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


关于这个问题 - 显然是受到 What is a stack trace, and how can I use it to debug my application errors? 的启发,有很多问题表明他们的应用程序已经崩溃,但没有任何进一步的细节。这个问题旨在指导新手 Android 程序员如何尝试自己解决问题,或提出正确的问题。

【问题讨论】:

  • 我看到很多问题都被这个骗子解决了。这是帮助人们在他们的问题中发布相关数据的一个很好的参考。但是,这不是那里任何根本问题的重复,而只是挖掘根本问题的方法。我认为最好仅提供此问题的链接作为参考,而不是重复关闭。
  • 我认为 close 函数非常适合这个。这些问题中的大多数都表明对基本调试技能知之甚少。搁置他们为他们提供了一个机会,使用答案中所述的方法来澄清他们的问题。更好的是,他们也许能够自己解决问题。不过,这个讨论可能更适合 meta.stackoverflow.com。
  • 这个问题太模糊了。更好的问题是“使用 [myIDE] 如何调试”显示错误“不幸的是,MyApp 已停止”的 Android 应用程序
  • @ChrisHalcrow 这个 Q/A 根本不是关于调试的。它是关于指导 Android 初学者如何处理应用程序崩溃。

标签: java android debugging kotlin


【解决方案1】:

此答案描述了检索堆栈跟踪的过程。已经有堆栈跟踪?阅读“What is a stack trace, and how can I use it to debug my application errors?”中的堆栈跟踪

问题

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

如何解决?

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

Android 工作室

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

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

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

阅读“What is a stack trace, and how can I use it to debug my application errors?”中的堆栈跟踪

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

如果您找到了您的 Exception 和它发生的行,但仍然不知道如何解决它,请不要犹豫,在 StackOverflow 上提问。

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

【讨论】:

  • 我知道这篇文章已经过时了:但是如果你使用 IntelliJ IDEA,你可以进入 Android > Devices|Logcat 并添加一个新过滤器 (i.imgur.com/145dtkx.png),然后将其过滤为 by Log Message 在这里你可以放FATAL EXCEPTION (i.imgur.com/HpELhaU.png) 所以在这个盒子里你可以阅读你的应用程序抛出的所有Exceptions。有了这个,你不需要清除 logcat 并再次崩溃。我认为 Android Studio 也有这个选项。
  • 在 Eclipse 中过滤 logcat 可以通过在过滤器的应用程序名称字段中输入 java 包名称来完成。
  • 我认为重点是了解异常发生时的追溯。 FC 在没有回溯或不可用的情况下有点糟糕,这就是它变得毛茸茸的地方。但我认为这个解释是寻找/识别此类错误的一个很好的介绍。
  • 当你的 logcat 有一些错误痕迹时,事情很容易,但万一 logcat 什么都没有呢? stackoverflow.com/questions/32455645/…
  • 问题是该行不包含堆栈跟踪写入和指向的错误。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 如果你能上传一个展示这种现象的项目,我会很感兴趣。
    【解决方案4】:

    您可以使用Google's ADB tool获取Logcat file来分析问题。

    adb logcat > logcat.txt
    

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

    【讨论】:

    • 这太棒了,即使您的调试器未能捕获它,它也会快速显示设备上发生的任何事情,如果运行时无法加载,Xamarin 可能会发生这种情况。
    • 我不明白为什么我的应用程序在 android studio logcat 中崩溃了,根本没有错误。这个答案给了我我需要的东西。但是后来我意识到我在工作室 logcat 中有一些过滤器阻止我看到错误。我切换回“仅显示选定的应用程序”,并且我已备份并运行。
    • 你应该添加-d,否则你会用 ctrl-C 退出 logcat。我做adb logcat -v time -d > filename.txt
    【解决方案5】:

    只需检查 log cat 中的错误。

    你从 eclipse 中获得 log cat 选项:

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

    日志猫包含错误。

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

    右键项目->调试为->Android应用

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        【解决方案7】:

        你必须检查Stack trace

        怎么做?

        在您的 IDE 上检查窗口窗体 LOGCAT

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

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

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

        adb logcat > logcat.txt

        【讨论】:

          【解决方案8】:

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

          1. adb logcat

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

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

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

          1. Android 工作室

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

          【讨论】:

            【解决方案9】:

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

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

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

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

            【讨论】:

              【解决方案10】:

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

              文档

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

              HERE是Android关于logcat的页面

              如果你使用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

              空指针异常错误

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

              您试图从 FragmentActivity 对象调用方法 onBackPressed()。但是,当您执行此操作时,该对象是 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)
              

              等等……

              概述

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

              希望能帮到你... 问候

              【讨论】:

                【解决方案11】:

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

                注意 2: 我认为您的设备已成功连接。


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

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

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

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

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

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

                如果 Caused by: 下没有带有蓝色文本的行,则寻找另一个有的 Caused by:

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

                throw new RuntimeException();
                

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


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

                java.lang.NullPointerException
                

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

                mTextView.setText(myString);
                

                所以,现在我要调试。根据this StackOverflow question,NullPointerException 表示某事是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,我们正在检查调试。这就是我们将其更改为调试的原因。

                注意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 为空的原因,因为我忘了告诉我的应用它是什么。所以我添加了那行,运行我的应用程序,现在应用程序没有崩溃。


                【讨论】:

                【解决方案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();
                }
                

                【讨论】:

                  【解决方案13】:

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

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

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

                  【讨论】:

                    【解决方案14】:

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

                    【讨论】:

                      【解决方案15】:

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

                      当任何error 发生时,请务必检查带有红色文本的 logcat,但是您可以在那些红色文本中找出带有下划线的蓝色文本中的 真正问​​题

                      确保如果您创建新的activity,请始终在AndroidManifest 文件中声明activity

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

                      【讨论】:

                        【解决方案16】:

                        开发过程中崩溃

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

                        如果你不喜欢它,还有很多替代品desktop log viewers for Android

                        在野外崩溃

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

                        阅读How to Release a Buggy App (And Live to Tell the Tale),了解更多关于处理现场错误的信息。

                        【讨论】:

                          【解决方案17】:

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

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

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

                          应用崩溃时的常见错误,例如:

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

                          解决应用崩溃错误:

                          • 牢记以上几点并通过它。
                          • 出现错误时,文件名也会显示为蓝色(单击它们并跳转到发生错误的代码)。

                          【讨论】:

                            【解决方案18】:

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

                            之后,您会发现您的应用停止了从您的角度修复该问题。

                            【讨论】:

                              【解决方案19】:

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

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

                              欲了解更多信息,请查看https://source.android.com/devices/tech/debug

                              【讨论】:

                                【解决方案20】:

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

                                gradlew build > log.txt 2>details.txt
                                

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

                                【讨论】:

                                  【解决方案21】:

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

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

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

                                  【讨论】:

                                    【解决方案22】:

                                    我会提出类似以下的建议

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

                                    【讨论】:

                                      猜你喜欢
                                      • 2022-01-15
                                      相关资源
                                      最近更新 更多