我正在开发一个应用程序,每次运行它时,都会收到消息:
不幸的是,MyApp已停止。
我该怎么解决?
关于这个问题-显然是受什么是堆栈跟踪的启发,以及如何使用它来调试应用程序错误?,有很多问题表明它们的应用已崩溃,没有任何进一步的细节。这个问题的目的是指导Android新手如何自行解决问题或提出正确的问题。
我正在开发一个应用程序,每次运行它时,都会收到消息:
不幸的是,MyApp已停止。
我该怎么解决?
关于这个问题-显然是受什么是堆栈跟踪的启发,以及如何使用它来调试应用程序错误?,有很多问题表明它们的应用已崩溃,没有任何进一步的细节。这个问题的目的是指导Android新手如何自行解决问题或提出正确的问题。
Answers:
此答案描述了检索堆栈跟踪的过程。已经有堆栈跟踪了吗?在“ 什么是堆栈跟踪,以及如何使用它来调试应用程序错误? ”中阅读堆栈跟踪。
您的应用程序退出,因为RuntimeException
抛出了未捕获的文件。
其中最常见的是NullPointerException
。
每当Android应用程序崩溃(或与此相关的任何Java应用程序)崩溃时,都会将a Stack trace
写入控制台(在本例中为logcat)。此堆栈跟踪包含解决问题的重要信息。
在窗口的底部栏中,单击Logcat
按钮。或者,您可以按alt+ 6。确保在Devices
面板中选择了仿真器或设备。接下来,尝试找到以红色显示的堆栈跟踪。可能有很多东西登录到logcat中,因此您可能需要滚动一下。查找堆栈跟踪的一种简单方法是清除logcat(使用右侧的回收站),然后让应用再次崩溃。
好极了!您已经解决了一半问题。
您只需分析堆栈跟踪,找出导致应用程序崩溃的原因。
在“ 什么是堆栈跟踪,以及如何使用它来调试应用程序错误? ”中阅读堆栈跟踪。
如果您找到Exception
了它所在的行,并且仍然找不到解决方法,请立即在StackOverflow上提问。
尽量简明扼要:发布堆栈跟踪和相关代码(例如,在抛出的行之前增加几行Exception
)。
Android > Devices|Logcat
并添加新的过滤器(i.imgur.com/145dtkx.png),并在by Log Message
此处进行过滤,您可以将其放入FATAL EXCEPTION
(i.imgur.com/HpELhaU .png),因此您可以在此框中读取Exceptions
应用程序抛出的所有内容。这样,您无需清除logcat并再次执行崩溃。我认为Android Studio也有此选项。
您可以使用谷歌的ADB工具获得Logcat file
分析问题。
adb logcat > logcat.txt
打开logcat.txt
文件并搜索您的应用程序名称。应该有关于失败原因,行号,类名等的信息。
-d
,否则您将无法使用ctrl-C退出logcat。我愿意adb logcat -v time -d > filename.txt
首先,您检查您的应用崩溃了的时间点(Unfortunately, MyApp has stopped.
)。为此,您可以使用Log.e("TAG", "Message");
,使用此行,您可以在logcat中看到您的应用程序日志。
之后,您会发现您的应用停止了哪一点,这很容易在您身边解决。
只需检查日志猫中的错误。
您可以从Eclipse中获取log cat选项:
窗口->显示视图->其他-> Android-> Logcat
日志猫包含错误。
否则,您还可以通过在调试模式下执行应用程序来检查错误。首先通过以下操作设置断点:
右键单击项目->调试为-> Android应用程序
注意:此答案使用的是Android Studio 2.2.2
注意2: 我正在考虑您的设备已成功连接。
当应用程序崩溃时,您要做的第一件事是查看LogCat,在Android Studio的底部,有一个带有菜单列表的工具栏:
单击“ Android Monitor”(我在上图中带下划线的那个。^)
现在,您将获得如下内容:
Verbose
将“ Error
” 更改为“ ”,它将仅显示您记录的错误。现在就不必担心所有这些错误(如果有)。
好。现在,执行崩溃应用程序的操作。应用崩溃后,转到日志目录。你会发现,有很多新的崩溃日志at:x.x.x
:和Caused by: TrumpIsPresidentException
的例子。Caused by:
在您的logcat中转到该语句。
旁边那个Caused By:
,应该是发生了异常。在我的情况下,它是一个,RuntimeException
并且在其下应该有一行,其中包含一个蓝色链接,例如:
如果该Caused by:
行下方没有一行带有蓝色文本的行,则寻找另一行Caused by:
。
单击该蓝色链接。它应该带您到发生问题的位置。就我而言,这是由于以下原因:
throw new RuntimeException();
所以,现在我知道为什么它崩溃了。这是因为我自己抛出了异常。这是一个明显的错误。
但是,假设我遇到了另一个错误:
java.lang.NullPointerException
我检查了我的logcat,单击了它给我的蓝色链接,然后把我带到了这里:
mTextView.setText(myString);
所以,现在我要调试。根据这个StackOverflow问题,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右上方的“无过滤器”下拉菜单。选择“编辑过滤器配置”,为过滤器命名,然后在“日志标签”中放置“应用程序调试”。点击“确定”。现在,您应该在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
为空的原因,因为我忘了告诉我的应用程序了。所以我添加了这一行,运行我的应用程序,现在该应用程序不会崩溃。
检查您的Logcat
消息并查看您的Manifest
文件。应该缺少一些东西,例如定义Activity,
用户权限等。
您可以使用以下任何工具:
亚行日志猫
adb logcat> logs.txt(您可以使用编辑器打开和搜索错误。)
eclipse logcat(如果在eclipse中不可见,请转到Windows-> Show View-> Others-> Android-> LogCat)
- Android调试监视器或Android设备监视器(键入命令监视器或通过UI打开)
- Android Studio
我建议使用Android Debug Monitor,这很好。因为当日志太多时,eclipse会挂起,并且通过adb logcat过滤器会很困难。
您必须检查 Stack trace
怎么做?
在IDE上检查Windows窗体LOGCAT
如果看不到logcat窗口,请转到此路径并打开它
window->show view->others->Android->Logcat
如果您使用的是Google-Api,请转到此路径
亚行logcat> logcat.txt
在下面的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();
}
让我分享一个基本的Logcat分析,供您在遇到强制关闭时(应用停止运行时)使用。
DOCS
Android收集/分析日志的基本工具是logcat。
这里是关于logcat的Android页面
如果您使用的是Android Studio,还可以检查此LINK。
捕捉
基本上,您可以使用以下命令来手动捕获logcat(或仅检查AndroidStudio中的AndroidMonitor窗口):
adb logcat
您可以在命令中添加很多参数,这些参数可以帮助您过滤和显示所需的消息...这是个人的...我总是使用以下命令来获取消息时间戳:
adb logcat -v time
您可以将输出重定向到文件,然后在文本编辑器中对其进行分析。
分析
如果您的应用正在崩溃,您将得到类似以下内容的信息:
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
您执行操作的时间。
堆栈跟踪:堆栈跟踪向您显示方法的调用顺序...有时,错误发生在调用方法中(而不是在被调用方法中)。
在com.example.khan.abc.AudioFragment $ 1.onClick(AudioFragment.java:125)
错误发生在file 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)
等等....
总览
这只是一个概述...并非所有日志都很简单,等等...只是为了分享想法并为您提供入门级信息...
希望我能有所帮助...
您也可以单独获取此错误消息,而无需任何堆栈跟踪或任何其他错误消息。
在这种情况下,您需要确保正确配置了Android清单(包括库中发生的所有清单合并以及库中发生的任何活动),并特别注意清单文件中应用程序中显示的第一个活动。
尝试使用我最喜欢的工具logview获取日志并在开发过程中对其进行分析。
确保标记./logview
和./lib/logview.jar
在Linux上运行时,为可执行文件。
如果您不喜欢它,则有许多其他的Android桌面日志查看器。
集成了诸如Firebase Crashlytics之类的实时崩溃报告工具,以获取用户设备上发生的未处理异常的堆栈跟踪。
阅读如何发布Buggy应用程序(并现场讲述故事),以了解有关在现场处理错误的更多信息。
logcat的 - 检查日志Android Studio中的发展阶段
最初清除Logcat并再次使应用程序崩溃,以便您仅可以获取崩溃的日志详细信息。您必须检查堆栈跟踪
不幸的是,MyApp已停止。原因很多。您可以在日志中检查它们。为此,您可以使用Log.e(“ TAG”,“ Message”);
应用程式崩溃时的常见错误,例如:
解决应用崩溃错误:
首先,您需要检查您的应用程序在哪里以及为什么崩溃了。(Unfortunately, MyApp has stopped.).
在的帮助下LOG
,您可以找出问题出在哪里。
之后,您会发现您的应用停止从哪个角度修复该问题。
如果您的终端没有任何有趣的日志(或者它们与您的应用没有直接关系),则可能是由于本机库引起的。在这种情况下,您应该检查终端中的“逻辑删除”文件。
逻辑删除文件的默认位置取决于每个设备,但是如果是这种情况,您将看到一条日志,告诉您: Tombstone written to: /data/tombstones/tombstone_06
另外在终端中运行此命令可以帮助发现问题:
gradlew build > log.txt 2>details.txt
那么您应该在上面的两个日志文件中转到gradlew文件位置。