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

nha*_*man 759 java crash debugging android kotlin

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

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

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


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

nha*_*man 700

这个答案描述了检索堆栈跟踪的过程.已经有堆栈跟踪?阅读上的堆栈跟踪在" 什么是堆栈跟踪,我怎么可以用它来调试应用程序错误? "

问题

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

怎么解决?

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

Android Studio

在Android Studio中查找堆栈跟踪

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

我找到了堆栈跟踪,现在是什么?

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

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

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

如果您找到Exception了它和它所在的行,并且仍然无法弄清楚如何解决它,请不要犹豫,在StackOverflow上提出问题.

尝试尽可能简洁:发布堆栈跟踪和相关代码(例如,几行直到抛出的行Exception).

  • 我知道这篇文章很老了:但是如果你使用IntelliJ IDEA,你可以进入`Android> Devices | Logcat`并添加一个新的过滤器(http://i.imgur.com/145dtkx.png),并过滤它为`通过Log Message`这里你可以把'FATAL EXCEPTION`(http://i.imgur.com/HpELhaU.png)放到这个Box中,你可以阅读你的应用程序抛出的所有`异常'.有了这个,你不需要清除logcat并再次崩溃.我认为Android Studio也有这个选项. (32认同)
  • 当你的logcat有一些错误的痕迹时,事情很容易,但是logcat什么都没有?http://stackoverflow.com/questions/32455645/unfortunately-myapp-has-stopped-no-error-logs-in-logcat#32455752 (4认同)
  • 问题是该行不包含堆栈跟踪写入和指向的错误. (4认同)

Vla*_*den 109

您可以使用谷歌的ADB工具获得Logcat file分析问题.

adb logcat > logcat.txt
Run Code Online (Sandbox Code Playgroud)

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


Hir*_*ela 37

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

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


Rah*_*Ali 28

只需检查log cat中的错误.

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

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

Log cat包含错误.

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

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


Ab_*_*Ab_ 26

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

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


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

图片

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

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

图片

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

图片

好.现在,做你做的让你的应用程序崩溃.应用程序崩溃后,转到logcat.你应该找到一个新的崩溃日志,它有很多at:x.x.x:Caused by: TrumpIsPresidentException例如.转到Caused by:logcat中的那个语句.

图片

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

图片

如果那个Caused by:在它下面的某个地方没有蓝色文字的那一行,那就找另一个Caused by:.

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

throw new RuntimeException();
Run Code Online (Sandbox Code Playgroud)

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


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

java.lang.NullPointerException
Run Code Online (Sandbox Code Playgroud)

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

mTextView.setText(myString);
Run Code Online (Sandbox Code Playgroud)

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

那么,让我们找出什么是null.有两种可能性.要么mTextView为null,要么myString为null.为了找到答案,在这mTextView.setText(mString)行之前,我添加了这两行:

Log.d("AppDebug","mTextView is null: " + String.valueOf(mTextView == null);
Log.d("AppDebug","myString is null: " + String.valueOf(myString== null);
Run Code Online (Sandbox Code Playgroud)

现在,就像我们之前做的那样(我们将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
Run Code Online (Sandbox Code Playgroud)

所以,自从我们使用以来Log.d,我们正在检查Debug.这就是我们将其更改为调试的原因.

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

yourPackageNameAndApp: mTextView is null: true
yourPackageNameAndApp: myString is null: false
Run Code Online (Sandbox Code Playgroud)

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

我观察我的代码,现在我发现了一些东西.

我已经private TextView mTextView在课堂上宣布了.但是,我没有定义它.

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

mTextView = (TextView) findViewById(R.id.textview_id_in_xml);
Run Code Online (Sandbox Code Playgroud)

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


  • @VivekMishra当墙建成时 (3认同)

小智 19

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

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

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


Man*_*war 17

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


Shi*_*yya 14

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

  1. adb logcat

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

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

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

在此输入图像描述

  1. Android Studio

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


ali*_*ini 12

你必须检查 Stack trace

怎么做?

在您的IDE上检查窗体LOGCAT

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

window->show view->others->Android->Logcat
Run Code Online (Sandbox Code Playgroud)

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

adb logcat> logcat.txt


小智 10

在下面的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();
}
Run Code Online (Sandbox Code Playgroud)


W0r*_*0le 9

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

DOCS

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

是关于logcat的Android页面

如果您使用Android Studio,您也可以检查此LINK.

捕获

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

adb logcat
Run Code Online (Sandbox Code Playgroud)

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

adb logcat -v time
Run Code Online (Sandbox Code Playgroud)

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

分析

如果你的应用程序是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
Run Code Online (Sandbox Code Playgroud)

这部分日志向您展示了很多信息:

  • 问题发生时: 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你做的时候.

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

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

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

它被称为:

at android.view.View.performClick(View.java:4848)
Run Code Online (Sandbox Code Playgroud)

被称为:

at android.view.View$PerformClick.run(View.java:20262)
Run Code Online (Sandbox Code Playgroud)

被称为:

at android.os.Handler.handleCallback(Handler.java:815)
Run Code Online (Sandbox Code Playgroud)

等等....

概观

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

我希望我可以帮助你... ...问候


Bis*_*kar 8

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

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

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

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


fel*_*lae 7

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


Kop*_*ant 6

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

如果error发生任何事情,请始终使用红色文本检查 logcat,但是您可以在蓝色文本中找出真正的问题,这些红色文本中带有下划线

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

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


Ash*_*ish 6

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

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

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

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

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

要解决应用程序崩溃错误:

  • 请记住以上几点并通过它。
  • 出现错误时,您还将获得蓝色的文件名(单击它们并跳转到发生错误的代码)。


Pel*_*nic 5

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

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

  • 如果您可以上传一个演示这种现象的项目,我将很感兴趣。 (3认同)

naX*_*aXa 5

开发过程中崩溃

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

如果您不喜欢它,则有许多其他的Android桌面日志查看器

在野外崩溃

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

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


zap*_*tec 5

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

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

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


归档时间:

查看次数:

410123 次

最近记录:

6 年,3 月 前