我正在开发一个应用程序,每次运行它时,我都收到消息:
不幸的是,MyApp已经停止了 .
我该怎么做才能解决这个问题?
关于这个问题 - 很明显受到What is a stack trace, and how can I use it to debug my application errors?的启发,有很多问题表明他们的应用程序崩溃了,没有任何进一步的细节 . 这个问题旨在指导新手Android程序员如何尝试自己解决问题,或者提出正确的问题 .
我正在开发一个应用程序,每次运行它时,我都收到消息:
不幸的是,MyApp已经停止了 .
我该怎么做才能解决这个问题?
关于这个问题 - 很明显受到What is a stack trace, and how can I use it to debug my application errors?的启发,有很多问题表明他们的应用程序崩溃了,没有任何进一步的细节 . 这个问题旨在指导新手Android程序员如何尝试自己解决问题,或者提出正确的问题 .
16 回答
您可以使用以下任何工具:
我建议使用 Android Debug Monitor ,这很好 . 因为当有太多日志时eclipse挂起,并且通过adb logcat过滤器并且都很困难 .
首先,检查您的应用程序崩溃的点(
Unfortunately, MyApp has stopped.
) . 为此您可以使用Log.e("TAG","Message");
,使用此行您可以看到您登录logcat的应用程序 .之后,您会发现您的应用已经停止了哪一点非常容易在您身边解决 .
人们会犯错误,所以编码也是如此 .
当发生任何
error
时,总是检查带有红色文本的logcat,但是你可以找到蓝色文本中的真正问题,并在那些红色文本中加下划线 .确保如果你创建一个新的
activity
,总是在AndroidManifest
文件中声明activity
.如果添加Permission,也要在
AndroidMainifest
文件中声明它 .当我遇到强制关闭时(当应用程序停止工作时),让我分享一个基本的Logcat分析 .
DOCS
Android中用于收集/分析日志的基本工具是logcat .
HERE是关于logcat的Android页面
如果你使用android Studio,你也可以检查这个LINK .
Capturing
基本上,您可以使用以下命令手动捕获logcat(或者只检查AndroidStudio中的AndroidMonitor窗口):
你可以添加很多参数来帮助你过滤和显示你想要的消息...这是个人的...我总是使用下面的命令来获取消息时间戳:
您可以将输出重定向到文件并在文本编辑器中进行分析 .
Analyzing
如果你的应用程序是Crashing,你会得到类似的东西:
这部分日志向您展示了很多信息:
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显示发生错误的行)它被称为:
被称为:
被称为:
等等....
Overview
这只是一个概述......并非所有日志都很简单等......只是分享想法并为您提供入门级信息......
我希望我可以帮助你...关心
只有在代码中出现致命异常才会停止执行应用程序时,此弹出窗口才会显示 . 它可以是任何异常NullPointerException,OutOfMemoryException等 .
如果您仍在Android studio中开发应用程序,那么最好的方法是通过Logcat进行检查,这是快速查看堆栈跟踪并检查应用程序原因的方法 .
如果您的应用已经存在,则无法使用logcat . 因此,为此,您可以实施Crashlytics,为您提供发生的任何异常的错误报告 .
在下面的showToast()方法中,您必须通过这样做为上下文或应用程序上下文传递另一个参数,您可以尝试它 .
只需检查log cat中的错误 .
你从eclipse中得到了log cat选项:
Log cat包含错误 .
另外,您还可以通过在调试模式下执行应用程序来检查错误 . 首先通过以下方式设置断点:
您也可以单独获取此错误消息,而无需任何堆栈跟踪或任何进一步的错误消息 .
在这种情况下,您需要确保正确配置Android清单(包括从库中发生的任何清单合并以及来自库的任何活动),并特别注意清单文件中应用程序中显示的第一个活动 .
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:
,应该有发生的异常 . 在我的情况下,它是RuntimeException
和 under it 应该有一行包含 blue link ,如:If that Caused by: 在它下面的某个地方没有蓝色文本的行,然后查找另一个
Caused by:
.Click on that blue link . 它应该带你到问题发生的地方 . 就我而言,这是由于这一行:
所以,现在我知道为什么它's crashing. It' s因为我自己抛出异常 . This was an obvious error .
但是,假设我有另一个错误:
我检查了我的logcat,我点击了它给我的蓝色链接,它把我带到了这里:
所以,现在我想调试 . 根据this StackOverflow question,NullPointerException表示某些东西是
null
.那么,让我们找出 what is null . 有两种可能性 .
mTextView
为空,或myString
为空 . 为了找到答案,在mTextView.setText(mString)
行之前,我添加以下两行:现在,就像我们之前做的那样(我们将Verose更改为Error),我们想要将“Error”更改为“Debug” . 因为我们通过调试来记录 . 这是所有Log方法:
所以,既然我们使用了
Log.d
,那么我们为什么要将它改为调试 .注意
Log.d
有第一个参数,在我们的例子中是"AppDebug" . 单击logcat右上角的"No Filters"下拉菜单 . 选择"Edit Filter Configuration",为过滤器命名,然后在"Log Tag"中输入"App Debug" . 单击"OK" . 现在,您应该在logcat中看到两行:所以现在我们知道mTextView为null .
我观察我的代码,现在我发现了一些东西 .
我已经在课堂上声明了
private TextView mTextView
. 但是,我没有定义它 .基本上我忘了在我的onCreate()中这样做:
所以这就是为什么
mTextView
为空,因为我忘了告诉我的应用它是什么 . 所以我添加该行,运行我的应用程序,现在应用程序不会崩溃 .如果您的应用由于某种原因崩溃没有良好的堆栈跟踪 . 尝试从第一行调试它,然后逐行进行直到崩溃 . 然后你会得到答案,哪一行会给你带来麻烦 . 然后你可以将它包装成try catch块并打印错误输出 .
检查
Logcat
消息并查看Manifest
文件 . 应该有一些缺失,例如定义Activity,
用户权限等 .你必须检查
Stack trace
How to do that?
在您的IDE上检查窗口形成LOGCAT
如果你看不到logcat窗口转到这条路径并打开它
如果您使用Google-Api,请转到此路径
adb logcat> logcat.txt
这个答案描述了检索堆栈跟踪的过程 . 已经有堆栈跟踪?阅读“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
在窗口的底栏中,单击
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
的行) .您可以使用Google's ADB tool来获取
Logcat file
来分析问题 .打开
logcat.txt
文件并搜索你的申请名称 . 应该有关于它失败的原因,行号, class 名称等的信息 .使用 LogCat 并尝试查找导致应用崩溃的原因 .
要查看Logcat,如果您使用 Android Studio ,请按 ALT + 6 或
如果您使用 Eclipse 然后 Window -> Open Perspective -> Other - LogCat
转到LogCat,从下拉菜单中选择错误 . 这将包含帮助您调试的所有必需信息 . 如果这没有帮助,请将LogCat发布为您的问题的编辑,有人会帮助您 .
开发过程中崩溃
尝试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)以了解有关处理现场错误的更多信息 .