该函数如何产生Java.Lang.NullPointerException?

时间:2018-05-22 16:52:56

标签: java nullpointerexception crash java-native-interface

我收到一些用户的随机崩溃。它发生在一小部分用户身上,但我无法弄清楚这段代码在99%的时间内会起作用,而另一部分则失败1%。

这是Google Play报道的崩溃:

显示java.lang.NullPointerException:
1.在com.raptisoft.SB.SBActivity.IsPurchased(未知来源:13)
2.在com.raptisoft.SB.GameThread.AppThread(原生方法)
3.在com.raptisoft.SB.GameThread.run(未知来源:2)
4.在java.lang.Thread.run(Thread.java:784)

这是它崩溃的功能:

Bundle mOwnedItems; // Filled elsewhere

private boolean IsPurchased(String theData)
{
    if (theData==null) return false;
    boolean aResult=false;
    if (mOwnedItems.size()>0) if (mOwnedItems.containsKey("RESPONSE_CODE"))
    {
        int response = mOwnedItems.getInt("RESPONSE_CODE");
        if (response == 0 && mOwnedItems.containsKey("INAPP_PURCHASE_ITEM_LIST"))
        {
            ArrayList<String> ownedSkus = new ArrayList<String>();
            ownedSkus = mOwnedItems.getStringArrayList("INAPP_PURCHASE_ITEM_LIST");
            if (ownedSkus!=null) {
                for (int i = 0; i < ownedSkus.size(); ++i) {
                    String sku = ownedSkus.get(i);
                    if (sku.equals(theData)) {
                        aResult = true;
                        break;
                    }
                }
            }
        }
    }
    return aResult;
}

...反过来在本机代码中从此函数调用:

bool ToJava::IsPurchased(char* theData)
{
    if (theData==NULL) return false;

    JNIEnv* threadEnv=GetEnv();
    jstring aPassString = threadEnv->NewStringUTF(theData);
    jboolean aResult=threadEnv->CallBooleanMethod(g_theGlobalRefToActivityInstance,gIsPurchasedBridge,aPassString);
    threadEnv->DeleteLocalRef(aPassString);

    return (aResult!=0);
}

我一直在追逐这次崩溃两周,为这个功能增加了越来越多的保障 - 然而它仍然在发生。我只是在Java中,因为我的首选语言是C ++。任何人都可以告诉我这个函数中可能为null的东西吗?

0 个答案:

没有答案