我正在开发一个应用程序,每次运行它时,都会收到消息:
不幸的是,MyApp已经停止了。
我该怎么做才能解决这个问题?
关于这个问题 - 显然受到What is a stack trace, and how can I use it to debug my application errors?的启发,有很多问题表明他们的应用程序崩溃了,没有任何进一步的细节。这个问题的目的是指导新手Android程序员如何尝试自己解决问题,或者提出正确的问题。
答案 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)。此堆栈跟踪包含解决问题的重要信息。
在窗口的底栏中,单击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 tool让Logcat 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的底部有一个带有菜单列表的工具栏:
点击“Android监视器”(我在上图中加下划线的那个。^)
现在,你会得到这样的东西:
将“Verbose
”更改为“Error
”现在它只会显示已记录的错误。现在不要担心所有这些错误(如果你有的话)。
确定。现在,做你做的让你的应用程序崩溃。应用程序崩溃后,转到logcat。您应该找到一个新的崩溃日志,其中包含大量at:x.x.x
:和Caused by: TrumpIsPresidentException
。转到logcat中的Caused by:
语句。
旁边的Caused By:
,应该会发生异常。在我的情况下,它是RuntimeException
和 下面应该有一行包含蓝色链接,例如:
如果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)
此弹出窗口仅在您的代码中出现致命异常时停止执行应用程序。它可以是任何例外NullPointerException
,OutOfMemoryException
等。
如果您仍在Android studio中开发应用程序,那么最好的方法是通过 Logcat 进行检查,这是快速查看堆栈跟踪并检查应用程序原因的方法。
如果您的应用已经上线,则无法使用 logcat 。因此,为此您可以实现Crashlytics
为您提供发生的任何异常的错误报告。
答案 6 :(得分:15)
检查您的Logcat
消息并查看您的Manifest
文件。应该有一些缺失,例如定义Activity,
用户权限等等。
答案 7 :(得分:12)
您可以使用以下任何工具:
adb logcat
adb logcat> logs.txt(您可以使用编辑器打开并搜索错误。)
eclipse logcat(如果在eclipse中不可见,请转到Windows-> Show View-> Others-> Android-> LogCat)
- Android调试监视器或Android设备监视器(键入命令监视器或通过UI打开)
醇>
- Android Studio
醇>
我建议使用 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”);
应用崩溃时常见的错误,例如:
要解决应用崩溃错误:
答案 17 :(得分:2)
首先,您需要检查应用崩溃的原因和原因(Unfortunately, MyApp has stopped.).
,借助LOG
,您可以找出问题出在哪里。
在那之后,您发现您的应用停止从哪个角度修复该问题。
答案 18 :(得分:2)
如果您的终端没有任何有趣的日志(或者它们与您的应用没有直接关系),则可能是由于本机库引起的。在这种情况下,您应该检查终端中的“逻辑删除”文件。
逻辑删除文件的默认位置取决于每台设备,但是如果是这样,您将看到一条日志,告诉您:Tombstone written to: /data/tombstones/tombstone_06
答案 19 :(得分:2)
也在终端中运行此命令可以帮助发现问题:
gradlew build > log.txt 2>details.txt
然后您应该在上面的两个日志文件中转到gradlew文件位置。
答案 20 :(得分:0)
重新创建崩溃。
尝试重现其发生方式或时间的问题。
如果您以前有可行的解决方案,请将您所拥有的与现在所拥有的进行比较。
使用要点!!! :https://developer.android.com/studio/debug。逐步完成您的项目,尝试查看变量的值是什么以及为什么它可能崩溃。
使您的代码对其他任何人都可读和理解。 再次通读自己的代码,然后尝试看一下是否对您有意义,并向您自己解释。如果您的代码中有某些您不了解或不确定的内容,请再次查看,然后尝试通过以下方式将其写得更清楚:
(您必须了解您的代码,而 YOU 必须能够解释您要执行的操作)
最后,尝试研究并找出更多有关您不了解或不确定的代码的特定部分。
答案 21 :(得分:0)
如果您的应用崩溃没有任何错误,并且您没有使用资产管理器但加载了如下纹理:
Texture texture = new Texture("myImage.png"); //dont to this all the time
那就是问题所在。我就遇到过这种情况。您应该始终使用资产管理器来避免内存过载。