不幸的是,Java:MyApp的停止。我该如何解决这个?

Unfortunately MyApp has stopped. How can I solve this?

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

Unfortunately, MyApp has stopped.

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


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


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

问题

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

如何解决?

每次Android应用程序崩溃(或任何Java应用程序),EDOCX1 2都被写入控制台(在这种情况下,LogCAT)。这个堆栈跟踪包含解决问题的重要信息。

安卓工作室

Finding the stack trace in Android Studio

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

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

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

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

我还是解决不了我的问题!

如果您已经找到了您的Exception和它发生的行,但仍然无法找到如何修复它,请不要犹豫,在stackoverflow上问一个问题。

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


你可以使用谷歌的adb工具让Logcat file来分析这个问题。

1
adb logcat > logcat.txt

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


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

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


只需检查log cat中的错误。

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

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

日志cat包含错误。

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

right click on project->debug as->Android application


注:此答案使用Android Studio 2.2.2

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

当应用程序崩溃时,首先要做的就是查看logcat,在android studio的底部有一个工具栏,上面有一系列菜单:

image

点击"android monitor"(上图中我加下划线的那个)。^)

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

image

将"EDOCX1"〔0〕改为"EDOCX1"〔1〕只会显示记录的错误。现在不要担心所有这些错误(如果你有)。

image

好啊。现在,做你所做的来破坏你的应用程序。在你的应用程序崩溃后,去你的logcat。您应该找到一个新的崩溃日志,其中包含大量的at:x.x.xCaused by: TrumpIsPresidentException。去你的日志里的那个Caused by:声明。

image

除此之外,还有一个例外。在我的例子中,它是一个RuntimeException,在它下面应该有一条包含蓝色链接的线,例如:

image

如果该Caused by:下没有带蓝色文本的行,那么可以查找另一个Caused by:

点击那个蓝色链接。它应该把你带到问题发生的地方。在我的例子中,这是由于这句话:

1
throw new RuntimeException();

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

但是,假设我还有一个错误:

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

1
mTextView.setText(myString);

所以,现在我要调试。根据这个stackoverflow问题,nullpointerException表示某个东西是null

那么,我们来看看什么是空的。有两种可能性。或者mTextView为空,或者myString为空。为了查明,在mTextView.setText(mString)行之前,我添加了这两行:

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

现在,和以前一样(我们将verose更改为error),我们希望将"error"更改为"debug"。因为我们是通过调试登录的。以下是所有的日志方法:

1
2
3
4
5
6
7
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中看到两行:

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

现在我们知道mtextview为空。

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

我宣布江户一〔15〕在班上名列前茅。但是,我没有定义它。

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

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

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


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

最好的检查方法是通过logcat,如果你还在android studio中开发应用程序,这是快速读取堆栈跟踪和检查应用程序原因的方法。

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


检查您的Logcat消息,并查看您的Manifest文件。应该缺少定义Activity,用户权限等内容。


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

  • adb logcat

  • adb logcat > logs.txt (you can use editors to open and search errors.)

  • eclipse logcat (If not visible in eclipse, Go to Windows->Show View->Others->Android->LogCat)

  • Android Debug Monitor or Android Device Monitor(type command monitor or open through UI)
  • enter image description here

  • Android Studio
  • 我建议使用Android调试监视器,它很好。因为Eclipse挂起的时候日志太多了,而且通过adb logcat过滤器都很困难。


    你得检查一下Stack trace

    如何做到这一点?

    在您的IDE上,检查Windows窗体logcat

    如果你看不到logcat窗口,请走到这条路径并打开它。

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

    如果您使用的是Google API,请转到以下路径

    adb logcat>logcat.txt


    让我分享一个基本的logcat分析,当你遇到一个力关闭(当应用停止工作)。

    文档

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

    这是Android关于logcat的页面

    如果您使用Android Studio,也可以检查此链接。

    捕捉

    基本上,您可以使用以下命令手动捕获logcat(或者只检查androidstudio中的androidmonitor窗口):

    1
    adb logcat

    有很多参数可以添加到命令中,帮助您筛选和显示所需的消息…这是私人的…我总是使用下面的命令来获取消息时间戳:

    1
    adb logcat -v time

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

    分析

    如果你的应用程序崩溃了,你会得到如下信息:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    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.K.H.A.A.AudioFuffGrace$ 1。onClick(AudioFractJava:JAVA:125)

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

    它由以下人员调用:

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

    它由以下人员调用:

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

    它由以下人员调用:

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

    等。。。。

    概述

    这只是一个概述…并非所有的日志都很简单…它只是分享这个想法,并提供一个入门级的信息给你…

    我希望我能帮助你…当做


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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
      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();
    }


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

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

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

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


    如果你的应用因为某种原因崩溃,没有良好的stacktrace。尝试从第一行调试它,然后一行一行地进行调试,直到崩溃为止。然后你会得到答案,哪一行会给你带来麻烦。很有可能,然后您可以将其包装成try catch块并打印错误输出。


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

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


    开发期间崩溃

    尝试logview-0.20获取日志并在开发期间对其进行分析。在Linux中运行时,请确保将./logview./lib/logview.jar标记为可执行文件。

    如果你不喜欢它,有很多其他的桌面日志浏览器可供Android使用。

    在野外坠毁

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

    阅读如何发布Buggy应用程序(并实时讲述故事),了解更多关于处理现场错误的信息。


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

    首先清除logcat,让应用程序再次崩溃,这样您只能得到崩溃的日志详细信息。你必须检查堆栈跟踪

    While, Unfortunately, MyApp has stopped. There are many reasons for it. You can check same in logs. For this, you can use the Log.e("TAG","Message");

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

  • 编码错误(关键词使用错误)。
  • 属性名不匹配。
  • 不支持的插件(可能)。
  • 版本不匹配(可能)。
  • AndroidManifest文件中缺少活动。
  • AndroidManifest文件中缺少权限。
  • 最常见的NullPointerException。
  • 已声明但未定义。
  • 要解决应用程序崩溃错误:

    • 记住以上几点,并仔细阅读。
    • 有了这个错误,您还可以得到蓝色的文件名(点击它们并从错误中跳转到代码)。


    人们会犯错,因此也会编码。

    当出现任何error时,总是用红色文本与logcat进行核对,但是你可以在蓝色文本中找出真正的问题,红色文本中带有下划线。

    确保如果创建一个新的activity,总是在AndroidManifest文件中声明activity

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