如何在android中“printf”变量来检查我的代码?

时间:2011-05-26 13:57:30

标签: android nullpointerexception

我有一个问题,我正在尝试解决,我一直在尝试使用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)));

    }
    }

4 个答案:

答案 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