此函数如何生成Java.Lang.NullPointerException?

此函数如何生成Java.Lang.NullPointerException?,java,nullpointerexception,crash,java-native-interface,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

我收到一些用户的随机崩溃。这发生在一小部分用户身上,但我不知道在这段代码中,什么东西在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;
}

两周来,我一直在关注这个崩溃,为函数添加了越来越多的保护措施,但它仍然在发生。我只是在java中,因为我喜欢的语言是C++。有人能告诉我这个函数中什么是空的吗?

第13行是什么?--><代码>位于com.raptisoft.SB.SBActivity.IsPurchased(未知来源:13)。该行点左侧(
)的任何对象都可以是源。使用
System.out.println()
打印这些值,或者使用调试器设置断点并检查变量。我们不知道第13行是什么。第13行是哪一行?mOwnedItems看起来像什么?数据是如何存储的?@StephenCorcoran Change ownedSkus!=空到!ownedSkus.isEmpty()否。如果
mOwnedItems.getStringArrayList()返回
null
,则会导致NPE。最初发布的代码很好-如果不是
null
,请迭代元素。最有可能的问题——如果是在发布的代码中——是
mOwnedItems
在某种程度上是
null
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);
}