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

时间:2014-04-28 23:55:14

标签: java android debugging kotlin crash

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

  

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

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


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

22 个答案:

答案 0 :(得分:674)

此答案描述了检索堆栈跟踪的过程。已经有堆栈跟踪?阅读“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的行。)

答案 1 :(得分:100)

您可以使用Google's ADB toolLogcat file分析问题。

adb logcat > logcat.txt

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

答案 2 :(得分:35)

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

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

答案 3 :(得分:25)

只需检查log cat中的错误。

你可以在eclipse中获得log cat选项:

  

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

Log cat包含错误。

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

  

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

答案 4 :(得分:23)

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

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

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

image

点击“Android监视器”(我在上图中加下划线的那个。^)

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

image

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

image

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

image

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

image

如果Caused by: 在其下方某处没有蓝色文字的行,那么请查找另一个Caused by:

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

throw new RuntimeException();

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

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

java.lang.NullPointerException

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

mTextView.setText(myString);

所以,现在我想调试。根据{{​​3}},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为null。

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

我在课堂上宣布private TextView mTextView。但是,我没有定义它。

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

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

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

答案 5 :(得分:17)

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

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

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

答案 6 :(得分:15)

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

答案 7 :(得分:12)

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

  
      
  1. adb logcat

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

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

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

enter image description here

  
      
  1. Android Studio
  2.   

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

答案 8 :(得分:10)

您必须查看Stack trace

怎么做?

IDE上的

检查窗口LOGCAT

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

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

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

adb logcat> logcat.txt

答案 9 :(得分:9)

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

答案 10 :(得分:8)

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

<强> DOCS

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

HERE是Android关于logcat的页面

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

<强>捕获

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

adb logcat

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

adb logcat -v time

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

<强>分析

如果你的应用是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

您尝试从onBackPressed()对象调用方法FragmentActivity。但是,当您执行此操作时,该对象为null

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

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

文件com.example.khan.abc.AudioFragment.java中的错误发生在onClick()方法内的第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)

等...

<强>概述

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

我希望我能帮助你... 此致

答案 11 :(得分:7)

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

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

如果你使用 Eclipse 那么 窗口 - &gt;开放视角 - &gt;其他 - LogCat

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

答案 12 :(得分:6)

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

答案 13 :(得分:4)

您也可以单独获取此错误消息,而不会显示任何堆栈跟踪或任何其他错误消息。

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

答案 14 :(得分:4)

开发过程中崩溃

尝试使用我喜欢的工具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),以了解有关在现场处理错误的更多信息。

答案 15 :(得分:3)

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

当发生任何<machinenr>|<controldone>|<nrofitems|<items> 时,请务必使用红色文本检查logcat,但是你可以在那些红色文本中找到带有下划线的蓝色文本中的真实问题。

确保您创建新的error,始终在activity文件中声明activity

如果要添加权限,请在AndroidManifest文件中声明它。

答案 16 :(得分:3)

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

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

  

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

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

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

要解决应用崩溃错误:

  • 记住以上几点,并仔细研究。
  • 出现错误时,您还将获得蓝色的文件名(单击它们并从发生错误的地方跳转到代码)。

答案 17 :(得分:2)

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

在那之后,您发现您的应用停止从哪个角度修复该问题。

答案 18 :(得分:2)

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

逻辑删除文件的默认位置取决于每台设备,但是如果是这样,您将看到一条日志,告诉您:Tombstone written to: /data/tombstones/tombstone_06

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

答案 19 :(得分:2)

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

gradlew build > log.txt 2>details.txt

然后您应该在上面的两个日志文件中转到gradlew文件位置。

答案 20 :(得分:0)

重新创建崩溃。

尝试重现其发生方式或时间的问题。

  1. 您最近更改了什么?
  2. 如果您更改了一些与代码相关的内容,请尝试注释掉代码,直到达到不再崩溃的地步。
  3. 尝试在程序流中准确找到位置

如果您以前有可行的解决方案,请将您所拥有的与现在所拥有的进行比较。

使用要点!!! https://developer.android.com/studio/debug。逐步完成您的项目,尝试查看变量的值是什么以及为什么它可能崩溃。

使您的代码对其他任何人都可读和理解。 再次通读自己的代码,然后尝试看一下是否对您有意义,并向您自己解释。如果您的代码中有某些您不了解或不确定的内容,请再次查看,然后尝试通过以下方式将其写得更清楚:

  1. 使用清晰易懂的变量名
  2. 将代码分解为较小的部分(方法或函数)
  3. 使用评论来解释任何不清楚或不容易理解的内容

必须了解您的代码,而 YOU 必须能够解释您要执行的操作)

最后,尝试研究并找出更多有关您不了解或不确定的代码的特定部分。

答案 21 :(得分:0)

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

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

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