注意:此答案使用的是 Android Studio 2.2.2
注意 2: 我认为您的设备已成功连接。
当您的应用程序崩溃时,您要做的第一件事就是查看 LogCat,在 Android Studio 的底部有一个带有菜单列表的工具栏:
点击“Android Monitor”(我在上图中划线的那个。^)
现在,你会得到这样的东西:
将“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);
所以,现在我要调试。根据this StackOverflow question,NullPointerException 表示某事是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,我们正在检查调试。这就是我们将其更改为调试的原因。
注意Log.d 有第一个参数,在我们的例子中是“AppDebug”。单击 logcat 右上角的“No Filters”下拉菜单。选择“编辑过滤器配置”,为您的过滤器命名,然后在“日志标签”中输入“应用程序调试”。单击“确定”。现在,您应该在 logcat 中看到两行:
yourPackageNameAndApp: mTextView is null: true
yourPackageNameAndApp: myString is null: false
所以现在我们知道 mTextView 是空的。
我观察了我的代码,现在我注意到了一些东西。
我在班级顶部声明了private TextView mTextView。但是,我没有定义它。
基本上我忘了在我的 onCreate() 中这样做:
mTextView = (TextView) findViewById(R.id.textview_id_in_xml);
这就是mTextView 为空的原因,因为我忘了告诉我的应用它是什么。所以我添加了那行,运行我的应用程序,现在应用程序没有崩溃。