【问题标题】:NullPointerException when query contact information查询联系信息时出现 NullPointerException
【发布时间】:2012-08-15 18:08:44
【问题描述】:

我正在查询联系信息以获取电话号码和电子邮件地址, 这是我的代码:

protected void onPreExecute() {
    // get total count
    Cursor count = getContentResolver().query(
    ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
    total = count.getCount();

    // setup progress dialog
    progressDialog.setMessage(getString(R.string.profile_synchonizing));
    progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
    progressDialog.setProgress(0);
    progressDialog.setMax(total);
    progressDialog.show();        // Profile.java:270
}

protected Void doInBackground(String... arg0) {
    Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);

    while (cursor.moveToNext()) {
        String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
        String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));

        if (Integer.parseInt(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {
            Cursor phoneNumber = getContentResolver().query(Phone.CONTENT_URI, null, Phone.CONTACT_ID + " = ?", new String[] { contactId }, null);
            while (phoneNumber.moveToNext()) {
                // do something
            }
        }

        Cursor emails = getContentResolver().query(Email.CONTENT_URI, null, Email.CONTACT_ID + " = ?", new String[] { contactId }, null);
        while (emails.moveToNext()) {
            // do something
        }
    }
}

我已确定联系人有电话号码, 但是我仍然在这些行中遇到空指针异常:

while (phoneNumber.moveToNext())     //Profile.java:315
while (emails.moveToNext())

异常堆栈:

08-15 16:41:33.162: E/AndroidRuntime(20283): FATAL EXCEPTION: AsyncTask #2
08-15 16:41:33.162: E/AndroidRuntime(20283): java.lang.RuntimeException: An error occured while executing doInBackground()
08-15 16:41:33.162: E/AndroidRuntime(20283):    at android.os.AsyncTask$3.done(AsyncTask.java:200)
08-15 16:41:33.162: E/AndroidRuntime(20283):    at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
08-15 16:41:33.162: E/AndroidRuntime(20283):    at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
08-15 16:41:33.162: E/AndroidRuntime(20283):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
08-15 16:41:33.162: E/AndroidRuntime(20283):    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
08-15 16:41:33.162: E/AndroidRuntime(20283):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
08-15 16:41:33.162: E/AndroidRuntime(20283):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
08-15 16:41:33.162: E/AndroidRuntime(20283):    at java.lang.Thread.run(Thread.java:1027)
08-15 16:41:33.162: E/AndroidRuntime(20283): Caused by: java.lang.NullPointerException
08-15 16:41:33.162: E/AndroidRuntime(20283):    at test.Profile$SyncContactAsync.doInBackground(Profile.java:315)
08-15 16:41:33.162: E/AndroidRuntime(20283):    at test.Profile$SyncContactAsync.doInBackground(Profile.java:1)
08-15 16:41:33.162: E/AndroidRuntime(20283):    at android.os.AsyncTask$2.call(AsyncTask.java:185)
08-15 16:41:33.162: E/AndroidRuntime(20283):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
08-15 16:41:33.162: E/AndroidRuntime(20283):    ... 4 more
08-15 16:41:33.902: D/WindowManagerImpl(20283): finishRemoveViewLocked, mViews[0]: com.android.internal.policy.impl.PhoneWindow$DecorView@40545090
08-15 16:41:33.932: E/WindowManager(20283): Activity test.TabScreen has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@405bc868 that was originally added here
08-15 16:41:33.932: E/WindowManager(20283): android.view.WindowLeaked: Activity test.TabScreen has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@405bc868 that was originally added here
08-15 16:41:33.932: E/WindowManager(20283):     at android.view.ViewRoot.<init>(ViewRoot.java:278)
08-15 16:41:33.932: E/WindowManager(20283):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:149)
08-15 16:41:33.932: E/WindowManager(20283):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
08-15 16:41:33.932: E/WindowManager(20283):     at     android.view.Window$LocalWindowManager.addView(Window.java:433)
08-15 16:41:33.932: E/WindowManager(20283):     at android.app.Dialog.show(Dialog.java:265)
08-15 16:41:33.932: E/WindowManager(20283):     at test.Profile$SyncContactAsync.onPreExecute(Profile.java:270)
08-15 16:41:33.932: E/WindowManager(20283):     at android.os.AsyncTask.execute(AsyncTask.java:391)
08-15 16:41:33.932: E/WindowManager(20283):     at test.Profile$3.onItemClick(Profile.java:235)
08-15 16:41:33.932: E/WindowManager(20283):     at android.widget.AdapterView.performItemClick(AdapterView.java:284)
08-15 16:41:33.932: E/WindowManager(20283):     at android.widget.ListView.performItemClick(ListView.java:3569)
08-15 16:41:33.932: E/WindowManager(20283):     at android.widget.AbsListView$PerformClick.run(AbsListView.java:1831)
08-15 16:41:33.932: E/WindowManager(20283):     at android.os.Handler.handleCallback(Handler.java:587)
08-15 16:41:33.932: E/WindowManager(20283):     at android.os.Handler.dispatchMessage(Handler.java:92)
08-15 16:41:33.932: E/WindowManager(20283):     at android.os.Looper.loop(Looper.java:150)
08-15 16:41:33.932: E/WindowManager(20283):     at android.app.ActivityThread.main(ActivityThread.java:4385)
08-15 16:41:33.932: E/WindowManager(20283):     at java.lang.reflect.Method.invokeNative(Native Method)
08-15 16:41:33.932: E/WindowManager(20283):     at java.lang.reflect.Method.invoke(Method.java:507)
08-15 16:41:33.932: E/WindowManager(20283):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:849)
08-15 16:41:33.932: E/WindowManager(20283):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:607)
08-15 16:41:33.932: E/WindowManager(20283):     at dalvik.system.NativeStart.main(Native Method)

我检查了引发异常的联系人,它有电话号码和电子邮件地址。 我的代码有什么问题?

【问题讨论】:

  • 发布异常调用栈
  • phoneNumber 抛出空指针异常,如果跳过它,那么电子邮件也会抛出异常。
  • 你能发布 SyncContactAsync 类的 PreExecute 吗
  • 也许你正在使用getApplicationContext来初始化progressdialog?如果是这样,请将其更改为 Activity.this。请检查一次
  • 我发现了问题......我没有关闭光标!!每次迭代后只需关闭 phoneNumber 和 email,然后一切正常......我是个白痴 LOL

标签: java android


【解决方案1】:

您应该在所有游标上调用moveToFirst(),然后再遍历它们的数据,例如

Cursor cursor = getContentResolver.query( ... );
cursor.moveToFirst();
while( cursor.moveToNext() ) {
    // process data here...
}

希望这会有所帮助...

【讨论】:

  • 我在代码中的光标、电话号码和电子邮件中添加了moveToFirst(),但仍然出现异常......
【解决方案2】:

您可能忘记了清单 (AndroidManifest.xml) 中的联系人读取权限:

<uses-permission android:name="android.permission.READ_CONTACTS" />

注意:这也会导致 NULL 指针异常。

【讨论】:

  • 也许你的 doInBackground()-Functions 代码需要在 UI 线程中。尝试将您的联系人访问代码放入 UI 线程进行测试。如果它在那里工作,那可能就是问题所在。
【解决方案3】:

为什么在使用之前不检查光标是否为空值?
然后,您可以检查您的查询为什么它们没有返回结果

【讨论】:

  • 我查了一下,就是不知道为什么它们是空的,直到我发现我在上一次迭代中没有关闭它们......
  • 您的代码在执行moveToNext() 之前检查光标。现在,检查生成的 SQL 和参数。这里只是一个疯狂的猜测:示例似乎在生成的 SQL 中没有使用空格 - 试试 Phone.CONTACT_ID + "=?"
  • 我的意思是我之前检查过,而不是粘贴在这里的代码。我发现问题是我现在没有关闭光标。
  • 似乎未关闭游标太多使系统无法进行新的查询,所以返回null...LOL
猜你喜欢
  • 1970-01-01
  • 2015-06-07
  • 2019-09-10
  • 2018-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-20
  • 1970-01-01
相关资源
最近更新 更多