我正在开发一个应用程序,每次运行它时,我都会收到这样的消息:
不幸的是,MyApp已停止。
我可以做什么来解决这个问题?
关于这个问题-显然是受什么是堆栈跟踪以及如何使用它调试应用程序错误的启发?,有很多问题表明他们的应用程序已经崩溃,没有任何进一步的细节。这个问题旨在指导Android新手程序员如何自己解决问题,或者提出正确的问题。
我正在开发一个应用程序,每次运行它时,我都会收到这样的消息:
不幸的是,MyApp已停止。
我可以做什么来解决这个问题?
关于这个问题-显然是受什么是堆栈跟踪以及如何使用它调试应用程序错误的启发?,有很多问题表明他们的应用程序已经崩溃,没有任何进一步的细节。这个问题旨在指导Android新手程序员如何自己解决问题,或者提出正确的问题。
当前回答
人们会犯错,编码也是如此。
当发生任何错误时,总是用红色文本检查日志,但是你可以在蓝色文本中找到真正的问题,红色文本中有下划线。
确保如果您创建了一个新活动,请始终在AndroidManifest文件中声明该活动。
如果添加Permission,请在AndroidMainifest文件中声明它。
其他回答
注意:此答案使用Android Studio 2.2.2
注2:我正在考虑您的设备是否已成功连接。
当应用程序崩溃时,首先要做的是查看LogCat,在Android Studio的底部有一个带有菜单列表的工具栏:
单击“Android监视器”(我在上图中画了下划线的监视器。^)
现在,你会得到这样的结果:
将“Verbose”更改为“Error”现在它只会显示记录的错误。现在不要担心所有这些错误(如果你有)。
好的。现在,做你所做的,让你的应用崩溃。应用程序崩溃后,转到日志。例如,您应该找到一个新的崩溃日志,其中包含大量的:x.x.x:和由:TrumpIsPresidentException引起的异常。转到日志中的“引起原因:”语句。
在“引发者:”旁边,应该有发生的异常。在我的例子中,这是一个RuntimeException,在它下面应该有一行包含蓝色链接,例如:
如果这是由:没有一行下面有蓝色文本,那么寻找另一个由:有。
单击蓝色链接。它会把你带到问题发生的地方。在我的案例中,这是因为这句话:
throw new RuntimeException();
所以,现在我知道它为什么会崩溃了。这是因为我自己在抛出例外。这是一个明显的错误。
然而,假设我又犯了一个错误:
java.lang.NullPointerException
我检查了我的日志,我点击了它给我的蓝色链接,它把我带到了这里:
mTextView.setText(myString);
所以,现在我要调试。根据StackOverflow问题,NullPointerException表示某个内容为空。
那么,让我们来看看什么是空的。有两种可能性。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右上角的“无过滤器”下拉菜单。选择“编辑过滤器配置”,为过滤器命名,然后在“日志标记”中输入“应用程序调试”。单击“确定”。现在,您应该在日志中看到两行:
yourPackageNameAndApp: mTextView is null: true
yourPackageNameAndApp: myString is null: false
现在我们知道mTextView为空。
我观察我的代码,现在我注意到了一些东西。
我在类的顶部声明了私有TextView mTextView。但是,我没有定义它。
基本上,我忘记在onCreate()中执行此操作:
mTextView = (TextView) findViewById(R.id.textview_id_in_xml);
所以这就是mTextView为空的原因,因为我忘记告诉我的应用程序它是什么。所以我添加了那行,运行我的应用,现在应用程序不会崩溃。
检查您的Logcat消息。此外,请参阅Manifest文件以查找缺少的元素,如定义“活动”、用户权限等。
若要查看Logcat,如果您使用Android Studio,请按alt+6或
如果您使用Eclipse,那么窗口->打开透视->其他-LogCat
现在,从下拉菜单中选择error。
或者,您可以使用ADB工具获取Logcat文件来分析问题。
adb logcat > logcat.txt
现在打开logcat.txt文件并搜索应用程序名称。应该提供失败原因、行号、类名等信息。
检查Logcat消息并查看Manifest文件。应该缺少定义“活动”、“用户权限”等内容。
您可以使用以下任何工具:
adb测井仪adb logcat>logs.txt(您可以使用编辑器打开和搜索错误。)eclipse日志猫(如果在eclipse中不可见,请转到Windows->显示视图->其他->Android->日志猫)Android调试监视器或Android设备监视器(键入命令监视器或通过UI打开)
Android工作室
我建议使用Android调试监视器,它很好。因为当日志太多时,eclipse会挂起,而且通过adb logcat过滤器等都很困难。
人们会犯错,编码也是如此。
当发生任何错误时,总是用红色文本检查日志,但是你可以在蓝色文本中找到真正的问题,红色文本中有下划线。
确保如果您创建了一个新活动,请始终在AndroidManifest文件中声明该活动。
如果添加Permission,请在AndroidMainifest文件中声明它。