我有一个问题,我正在尝试解决,我一直在尝试使用mRowId从一个意图中获取我的数据,我已经在logCat上从fetchDrug()经常返回一个NullPointerException。
使用调试进行一些故障排除,我已经意识到我的变量mRowId不是Null并指向某些东西,但我不知道它的指向。
我如何检查我的变量mRowId指向的是什么?或者通常这些变量是不可理解的胡言乱语?
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.drug_info);
//Defining the views
mDrugText = (TextView) findViewById(R.id.drug);
mContentText = (TextView) findViewById(R.id.content);
Bundle extras = getIntent().getExtras();
mRowId = extras.getLong(DrugsDbAdapter.KEY_ROWID);
if(mRowId == null) {
Log.e("mRowId is null", "ok");
} else {
Cursor drug = mDbHelper.fetchDrug(mRowId);
//Managing Cursor to pluck values to display
startManagingCursor(drug);
mDrugText.setText(drug.getString(drug.getColumnIndexOrThrow(DrugsDbAdapter.KEY_DRUG)));
mContentText.setText(drug.getString(drug.getColumnIndexOrThrow(DrugsDbAdapter.KEY_CONTENT)));
}
}
答案 0 :(得分:1)
使用eclipse的调试功能,逐步完成代码。它给出了所有变量的值。
答案 1 :(得分:1)
对象通常会有一个“toString()”方法来以人类可读的形式表示对象;你可以把它传递给Log.e()调用。在您的情况下,它似乎是数字(长)而不是对象,因此您可以直接在日志中显示它。
一旦你知道你想要获取的行id,就可以通过检查数据库来验证它是否有效(使用内置在模拟器中的sqlite3命令,或者将文件解压缩到开发机器并使用任何无数的sqlite工具)。
如果行id有效,我建议查看你的数据库帮助程序代码,看看fetchDrug()方法是如何使用它的。空指针可能与参数无关,但与该方法中的其他项无关。
答案 2 :(得分:1)
使用SDK中的现有log功能,而不是printf。
输出将出现在Eclipse的logcat窗口中(可能是最好的选项,因为它是合理的实时,你可以过滤显示),或者你可以手动从设备/模拟器中提取日志。
例如:
Log.i ( "MyApp", "Drug = " + drug.getString ( drug.getColumnIndexOrThrow ( DrugsDbAdapter.KEY_DRUG ) ) );
答案 3 :(得分:0)
以下是一些需要考虑的选项:
选项1:在Eclipse中的onCreate中设置断点。您可以在此处找到有关在Eclipse中调试Android应用程序的更多详细信息:http://developer.android.com/guide/developing/debugging/debugging-projects.html
选项2:将Log语句添加到代码中并在logcat中查看输出。您可以在此处详细了解有关登录Android的信息:http://developer.android.com/reference/android/util/Log.html