为什么我的Android代码中出现空指针错误?

时间:2013-03-08 21:39:04

标签: java android nullpointerexception

我的代码中出现零点错误,日志指向此处

199     public void getPurchasedSubs () throws RemoteException {
200         Bundle ownedItems = mService.getPurchases(3, getPackageName(), "subs", null);

这是logcat文件转储

03-08 13:24:45.619: E/AndroidRuntime(7149): FATAL EXCEPTION: main
03-08 13:24:45.619: E/AndroidRuntime(7149): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.imobilize.ETV_V3_INAPP_SUB/com.imobilize.ETV_V3_INAPP_SUB.IntroBLevActivity}: java.lang.NullPointerException
03-08 13:24:45.619: E/AndroidRuntime(7149):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1970)
03-08 13:24:45.619: E/AndroidRuntime(7149):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1995)
03-08 13:24:45.619: E/AndroidRuntime(7149):     at android.app.ActivityThread.access$600(ActivityThread.java:128)
03-08 13:24:45.619: E/AndroidRuntime(7149):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1161)
03-08 13:24:45.619: E/AndroidRuntime(7149):     at android.os.Handler.dispatchMessage(Handler.java:99)
03-08 13:24:45.619: E/AndroidRuntime(7149):     at android.os.Looper.loop(Looper.java:137)
03-08 13:24:45.619: E/AndroidRuntime(7149):     at android.app.ActivityThread.main(ActivityThread.java:4517)
03-08 13:24:45.619: E/AndroidRuntime(7149):     at java.lang.reflect.Method.invokeNative(Native Method)
03-08 13:24:45.619: E/AndroidRuntime(7149):     at java.lang.reflect.Method.invoke(Method.java:511)
03-08 13:24:45.619: E/AndroidRuntime(7149):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:980)
03-08 13:24:45.619: E/AndroidRuntime(7149):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:747)
03-08 13:24:45.619: E/AndroidRuntime(7149):     at dalvik.system.NativeStart.main(Native Method)
03-08 13:24:45.619: E/AndroidRuntime(7149): Caused by: java.lang.NullPointerException
03-08 13:24:45.619: E/AndroidRuntime(7149):     at com.imobilize.ETV_V3_INAPP_SUB.IntroBLevActivity.getPurchasedSubs(IntroBLevActivity.java:200)
03-08 13:24:45.619: E/AndroidRuntime(7149):     at com.imobilize.ETV_V3_INAPP_SUB.IntroBLevActivity.checkValidation(IntroBLevActivity.java:238)
03-08 13:24:45.619: E/AndroidRuntime(7149):     at com.imobilize.ETV_V3_INAPP_SUB.IntroBLevActivity.onCreate(IntroBLevActivity.java:96)
03-08 13:24:45.619: E/AndroidRuntime(7149):     at android.app.Activity.performCreate(Activity.java:4470)
03-08 13:24:45.619: E/AndroidRuntime(7149):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1053)

此方法的SPECS

    /**
 * Returns the current SKUs owned by the user of the type and package name specified along with
 * purchase information and a signature of the data to be validated.
 * This will return all SKUs that have been purchased in V3 and managed items purchased using
 * V1 and V2 that have not been consumed.
 * @param apiVersion billing API version that the app is using
 * @param packageName package name of the calling app
 * @param type the type of the in-app items being requested
 *        ("inapp" for one-time purchases and "subs" for subscription).
 * @param continuationToken to be set as null for the first call, if the number of owned
 *        skus are too many, a continuationToken is returned in the response bundle.
 *        This method can be called again with the continuation token to get the next set of
 *        owned skus.
 * @return Bundle containing the following key-value pairs
 *         "RESPONSE_CODE" with int value, RESULT_OK(0) if success, other response codes on
 *              failure as listed above.
 *         "INAPP_PURCHASE_ITEM_LIST" - StringArrayList containing the list of SKUs
 *         "INAPP_PURCHASE_DATA_LIST" - StringArrayList containing the purchase information
 *         "INAPP_DATA_SIGNATURE_LIST"- StringArrayList containing the signatures
 *                                      of the purchase information
 *         "INAPP_CONTINUATION_TOKEN" - String containing a continuation token for the
 *                                      next set of in-app purchases. Only set if the
 *                                      user has more owned skus than the current list.
 */
Bundle getPurchases(int apiVersion, String packageName, String type, String continuationToken);

当我检查包裹名称时,它会恢复有效

以下是创建mService的代码         IInAppBillingService mService;

ServiceConnection mServiceConn = new ServiceConnection() {
   //@Overide
       public void onServiceDisconnected(ComponentName name) {
       mService = null;
   }
       //@Overide
   public void onServiceConnected(ComponentName name, 
      IBinder service) {
       mService = IInAppBillingService.Stub.asInterface(service);
   }

};  

我不太擅长解释logcat文件,所以答案可能就在我面前。

我认为这段代码应该打开它,所以我随时都可以使用mService。

        bindService(new 
            Intent("com.android.vending.billing.InAppBillingService.BIND"),
                    mServiceConn, Context.BIND_AUTO_CREATE);

1 个答案:

答案 0 :(得分:4)

我认为您在连接服务之前使用mService

我的建议是使用布尔变量来检查活动是否连接到服务, 或者像getPurchasedSubs ()一样使用onServiceConnected

ServiceConnection mServiceConn = new ServiceConnection() {
   public void onServiceDisconnected(ComponentName name) {
       mService = null;
   }

   public void onServiceConnected(ComponentName name, 
      IBinder service) {
       mService = IInAppBillingService.Stub.asInterface(service);
getPurchasedSubs ();
   }

};  

希望这对你有所帮助。