首页 文章

不幸的是MyApp已经停止了 . 我怎么解决这个问题?

提问于
浏览
665

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

不幸的是,MyApp已经停止了 .

我该怎么做才能解决这个问题?


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

16 回答

  • 5

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

    adb logcat adb logcat> logs.txt(您可以使用编辑器打开并搜索错误 . )eclipse logcat(如果在eclipse中不可见,请转到Windows-> Show View-> Others-> Android-> LogCat)Android Debug Monitor或Android设备监视器(类型命令监视器或通过UI打开)

    Android Studio

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

  • 7

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

    之后,您会发现您的应用已经停止了哪一点非常容易在您身边解决 .

  • 90

    人们会犯错误,所以编码也是如此 .

    当发生任何 error 时,总是检查带有红色文本的logcat,但是你可以找到蓝色文本中的真正问题,并在那些红色文本中加下划线 .

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

    如果添加Permission,也要在 AndroidMainifest 文件中声明它 .

  • 6

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

    DOCS

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

    HERE是关于logcat的Android页面

    如果你使用android Studio,你也可以检查这个LINK .

    Capturing

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

    adb logcat
    

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

    adb logcat -v time
    

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

    Analyzing

    如果你的应用程序是Crashing,你会得到类似的东西:

    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

    您试图从 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)
    

    等等....

    Overview

    这只是一个概述......并非所有日志都很简单等......只是分享想法并为您提供入门级信息......

    我希望我可以帮助你...关心

  • 615

    只有在代码中出现致命异常才会停止执行应用程序时,此弹出窗口才会显示 . 它可以是任何异常NullPointerException,OutOfMemoryException等 .

    如果您仍在Android studio中开发应用程序,那么最好的方法是通过Logcat进行检查,这是快速查看堆栈跟踪并检查应用程序原因的方法 .

    如果您的应用已经存在,则无法使用logcat . 因此,为此,您可以实施Crashlytics,为您提供发生的任何异常的错误报告 .

  • 19

    在下面的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();
    }
    
  • 2

    只需检查log cat中的错误 .

    你从eclipse中得到了log cat选项:

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

    Log cat包含错误 .

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

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

  • 12

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

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

  • 1

    Note: 这个答案是使用Android Studio 2.2.2

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


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

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

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

    更改“ Verbose " to " Error ”现在它只会显示已记录的错误 . 现在不要担心所有这些错误(如果你有的话) .

    好 . 现在,做你做了什么来破坏你的应用程序 . 应用程序崩溃后,转到logcat . 你应该找到一个新的崩溃日志,例如有很多 at:x.x.x :和 Caused by: TrumpIsPresidentException . 转到logcat中的 Caused by: 语句 .

    Next to 那个 Caused By: ,应该有发生的异常 . 在我的情况下,它是 RuntimeExceptionunder it 应该有一行包含 blue link ,如:

    If that Caused by: 在它下面的某个地方没有蓝色文本的行,然后查找另一个 Caused by: .

    Click on that blue link . 它应该带你到问题发生的地方 . 就我而言,这是由于这一行:

    throw new RuntimeException();
    

    所以,现在我知道为什么它's crashing. It' s因为我自己抛出异常 . This was an obvious error .


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

    java.lang.NullPointerException
    

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

    mTextView.setText(myString);
    

    所以,现在我想调试 . 根据this StackOverflow question,NullPointerException表示某些东西是 null .

    那么,让我们找出 what is 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"下拉菜单 . 选择"Edit Filter Configuration",为过滤器命名,然后在"Log Tag"中输入"App Debug" . 单击"OK" . 现在,您应该在logcat中看到两行:

    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 为空,因为我忘了告诉我的应用它是什么 . 所以我添加该行,运行我的应用程序,现在应用程序不会崩溃 .


  • 9

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

  • 3

    检查 Logcat 消息并查看 Manifest 文件 . 应该有一些缺失,例如定义 Activity, 用户权限等 .

  • 29

    你必须检查 Stack trace

    How to do that?

    在您的IDE上检查窗口形成LOGCAT

    如果你看不到logcat窗口转到这条路径并打开它

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

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

    adb logcat> logcat.txt

  • 21

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

    问题

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

    如何解决?

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

    Android Studio

    Finding the stack trace in Android Studio

    在窗口的底栏中,单击 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 的行) .

  • 6

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

    adb logcat > logcat.txt
    

    打开 logcat.txt 文件并搜索你的申请名称 . 应该有关于它失败的原因,行号, class 名称等的信息 .

  • 10

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

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

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

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

  • 0

    开发过程中崩溃

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

    如果你没有't like it, there'重新选择desktop log viewers for Android .

    在野外坠毁

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

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

相关问题