【问题标题】:NPE on HTC Sensation, works in the emulatorHTC Sensation 上的 NPE,在模拟器中工作
【发布时间】:2011-06-20 15:02:51
【问题描述】:

我使用了一些代码来创建一个简单的应用程序,以允许添加联系方式。代码非常简单,在模拟器和我拥有的许多设备上都可以正常工作,新的 HTC Sensation 除外。

代码如下:

ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
int rawContactInsertIndex = ops.size();

    ops.add(ContentProviderOperation.newInsert(RawContacts.CONTENT_URI)
                            .withValue(RawContacts.ACCOUNT_TYPE, null)
                            .withValue(RawContacts.ACCOUNT_NAME, null)
                            .build());

    ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
                            .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactInsertIndex)
                            .withValue(Data.MIMETYPE,Phone.CONTENT_ITEM_TYPE)
                            .withValue(Phone.NUMBER, number.getText().toString().trim())
                            .withValue(Phone.TYPE, "TYPE_MOBILE")
                            .build());
    ops.add(ContentProviderOperation.newInsert(Data.CONTENT_URI)
                            .withValueBackReference(Data.RAW_CONTACT_ID, rawContactInsertIndex)
                            .withValue(Data.MIMETYPE,
                             StructuredName.CONTENT_ITEM_TYPE)
                            .withValue(StructuredName.DISPLAY_NAME, name.getText().toString().trim())
                            .build());  
    try {
        ContentProviderResult[] res = getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
    } catch (RemoteException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (OperationApplicationException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

当我运行它时,我得到以下信息:

java.lang.NullPointerException
 at android.os.Parcel.readException(Parcel.java:1328)
 at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:160)
 at android.database.DatabaseUtils.readExceptionWithOperationApplicationExceptionFromParcel(DatabaseUtils.java:137)
 at android.content.ContentProviderProxy.applyBatch(ContentProviderNative.java:491)
 at android.content.ContentProviderClient.applyBatch(ContentProviderClient.java:95)
 at android.content.ContentResolver.applyBatch(ContentResolver.java:641)
 at uk.co.androidfun.getthatnumber.mainActivity.saveCallContact(mainActivity.java:157)
 at uk.co.androidfun.getthatnumber.mainActivity$3.onClick(mainActivity.java:74)
 at android.view.View.performClick(View.java:2532)
 at android.view.View$PerformClick.run(View.java:9277)
 at android.os.Handler.handleCallback(Handler.java:587)
 at android.os.Handler.dispatchMessage(Handler.java:92)
 at android.os.Looper.loop(Looper.java:143)
 at android.app.ActivityThread.main(ActivityThread.java:4196)
 at java.lang.reflect.Method.invokeNative(Native Method)
 at java.lang.reflect.Method.invoke(Method.java:507)
 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
 at dalvik.system.NativeStart.main(Native Method)

我查看并查看了代码,没有发现问题,正如我所说,在运行 2.3.3 的模拟器中运行良好,但在运行相同的手机上却不行。

谢谢 约翰

【问题讨论】:

  • Parcel.java 中的第 1328 行是哪一行?

标签: java android nullpointerexception


【解决方案1】:

我知道这是一个老问题,但我也被那个奇怪的 NPE 击中了,所以这可能会对某人有所帮助。

经过一番挖掘,我发现我给newInsert 的值之一是错误的类型(该死的重构!) 我有:

String val = ...;
builder.withValue(Data.RAW_CONTACT_ID, val);

代替:

long val = ...;
builder.withValue(Data.RAW_CONTACT_ID, val);

解决了 NPE 的问题。

因此,查看您的代码,我首先将“TYPE_MOBILE”更改为 Android const CommonDataKinds.Phone.TYPE_MOBILE(因为此值可能会因不同供应商而异), 其次,确保您在withValue 中使用的所有键的类型与您提供给它们的键类型相同(不确定'null' 对于ACCOUNT_TYPE 是否合法),并打印修剪后的字符串以确保它们具有有意义的值。

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    检查哪些代码引用了行

    androidfun.getthatnumber.mainActivity.saveCallContact(mainActivity.java:157)

    您的 logcat 还应该有更多内容,Caused by 等通常更直接地指向错误代码。

    【讨论】:

    • 最后一段不适用于这种情况 - NullPointerException 通常不会包含更基本的异常,因为它几乎总是由 VM 检测到空引用的取消引用引起的。跨度>
    • 很公平。不过,第 157 行是开始挖掘的地方。 ;) 看起来它来自 build() 语句之一,因为堆栈跟踪显示它深入到 contentresolver 和 db。
    【解决方案3】:

    我在使用两台 HTC 设备时遇到了同样的问题。 为我解决的问题是在最后一个数据条目中添加更多值(除了原始联系人 ID、电话号码和 mime 类型之外,我还添加了五个值)。 我不知道为什么它现在有效,但它确实有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-03
      • 1970-01-01
      • 2011-11-11
      • 2011-02-24
      相关资源
      最近更新 更多