在这篇文章中,我们将为您详细介绍使用for-each循环时LinkedList中的Nullpointer异常的内容,并且讨论关于foreachin循环的相关问题。此外,我们还会涉及一些关于30w+数据
在这篇文章中,我们将为您详细介绍使用for-each循环时LinkedList中的Nullpointer异常的内容,并且讨论关于for each in循环的相关问题。此外,我们还会涉及一些关于30w+数据使用RedisTemplate的pipeline空指针NullPointerException异常分析、android – admob 6.2.1 nullpointer异常、android – setSupportActionBar()抛出Nullpointer异常、android – 在startIntentSenderForResult中的NullPointer,不适用V3的知识,以帮助您更全面地了解这个主题。
本文目录一览:- 使用for-each循环时LinkedList中的Nullpointer异常(for each in循环)
- 30w+数据使用RedisTemplate的pipeline空指针NullPointerException异常分析
- android – admob 6.2.1 nullpointer异常
- android – setSupportActionBar()抛出Nullpointer异常
- android – 在startIntentSenderForResult中的NullPointer,不适用V3
使用for-each循环时LinkedList中的Nullpointer异常(for each in循环)
我遇到了非常奇怪的Java行为,但我不知道这是一个bug,还是我错过了一些东西。
该代码只需遍历stateStack(LinkedList)列表并销毁所有状态。
public void clearStates(){ LogFactory.getLog(StateController.class.getName()) .info( "Clearing states. #ofstates="+stateStack.size()); for (State state : stateStack) // Line 132 (see exception) { state.destroy(); } // ...}
引发了以下异常:
INFO controllers.StateController : Clearing states. #ofstates=1java.lang.NullPointerException\ at java.util.LinkedList$ListItr.next(LinkedList.java:891) at *.controllers.StateController.clearStates(StateController.java:132) // ... //
该代码通常可以正常工作,并且已经投入生产一年多了。
这可能是Java错误吗?
/ 更新 /
destroy()调用不会修改stateStack。如果可以的话,我猜Java会抛出ConcurrentModificationException。
stateStack填充了1个状态,该状态将覆盖destroy,但仅进行本地修改。然后,超级实现将打印不在日志文件中的其他日志(“销毁状态…”),因此我猜想该异常是在迭代开始时抛出的。
public void destroy(){ destroyed = true; LogFactory.getLog(State.class.getName()).info( "Destorying state : "+getClass().getName()); propertyChangeSupport.firePropertyChange(PROP_DESTROYED, null, this);}
答案1
小编典典下面的代码几乎每次运行它都会生成相同的异常-
想法是在从另一个线程迭代时修改列表。由于幸运的时机,修改发生在该方法之后checkForComodification
但之前,从而导致NPE。next= next.next;``ListItr#next
java.util.LinkedList $ ListItr.next(LinkedList.java:891)处的线程“
main”中的java.lang.NullPointerException,javaapplication4.Test1.main(Test1.java:74)处的异常
public class Test { public static void main(String[] args) { final int SIZE = 100000; final Random rand = new Random(); final List<Integer> list = new LinkedList<>(); for (int i = 0; i < SIZE; i++) { list.add(i); } Runnable remove = new Runnable() { @Override public void run() { while (true) { int i = rand.nextInt(SIZE); list.remove(i); try { Thread.sleep(10); } catch (InterruptedException ex) { break; } list.add(i); } } }; Thread t = new Thread(remove); t.start(); for (int i = 0; i < 100; i++) { try { for (Integer j: list) { ///whatever } } catch (ConcurrentModificationException e) { } catch (NullPointerException e) { e.printStackTrace(); } } t.interrupt(); }}
30w+数据使用RedisTemplate的pipeline空指针NullPointerException异常分析
为了实现业务需求,在flink流式处理时查询redis进行比对,然后方案是放在redis里的数据格式为Set,key使用的直接是对象的值,比如身份证号、手机号等等,然后value的值为该对象所属的任务ID,之所以是这样设计,是因为可能有多个任务都设置了该布控对象,这时候比对到了该对象,会根据任务id查询对应的策略进行不同的业务处理。
目前一个任务的对象的数据量批量插入20w+的数据到redis中,数据量比较大,所以用到了pipe,在使用过程中发生了错误,发生了NullPointerException异常,进行了排查记录如下
首先debug代码,伪代码就是
redisTemplate.executePipeLined(connection -> {
objectives.parallelStream().forEach(obj -> {
connection.setCommands().sAdd(rawKey,rawValue);
});
})
objectives是所有对象,这里我用到了并行流(后面我改成串行就没报错了,原因后面讲),代码是没啥问题的(),然后报错地方是执行完上述逻辑后,执行connection.closePipeLine()里的result.getResultHolder()该result是null,发现了异常,为啥list元素里会是空的呢,原来lettuce的pipe是初始化一个arraylist进行存储的,而我外面是一个并行流,相当于是并发调用connection.setCommands().sAdd()->pipe.add(),是这里发生了并发操作list的错误导致的。我自己写了一个测试用例,并行流调用arraylist.add,然后去遍历里面的元素,也是会报元素为空导致的NullPointerException
没想到啊,虽然lettuce底层是共享一个链接,使用的是netty的异步模型,不过也防止不了开发人员在外面是并发操作这个命令啊,lettuce是线程安全的库,但是这个LettuceConnection是spring这边实现的,结果来这一出...bug蛮多的,之前用spring-data-jpa那块分页也有点问题,模块太多了,依赖多个库之后配置多了可能spring的开发人员都弄不清关系了,给他们提了一个bug
https://github.com/spring-projects/spring-data-redis/issues/2653
接上面,我在调试的时候,pipe里有些返回值error是command timed out after 10 seconds,这就是原因,执行redis命令超时了,为啥会超时呢,由于我使用的是Lettuce的redis客户端库(最后发现就是这个库的原因),我开始自己调试,不调试不要紧,一调试震惊了,我在上面的forEach循环里打断点,结果发现执行一个sAdd就会立即把值flush推到redis服务器,马上就生效了。这说明lettuce的pipe根本就是个摆设,于是进去sAdd()看了一下,在DefaultEndpoint.write()方法里有个autoFlushCommands为true,所以其实每次sAdd()都会直接flush到服务器而不是添加到缓冲区buffer。
这里不得不说一下原因了,lettuce底层使用的是netty,是一个异步非阻塞(通过Future-Listener机制实现异步事件,网络IO使用的是同步非阻塞IO,即NIO)的线程和请求/响应模型(一般情况是不需要禁用自动刷新的,可见官网说明),所以我们才会在上面报command timed out after 10 seconds时没抛出来这个,因为使用的是netty的future每个请求都是异步的。这个错误是lettuce抛出来的,因为netty的异步模型,所以lettuce会给每个command(Future)设置一个ScheduleFuture定时任务,时间为timeout,里面的逻辑是如果command到时间了还没isDone()就会设置一个超时异常。
后面看了官网文档,其实建议我们用默认的自动flush就行了,我于是做了下对比,先把超时时间改大点,不让抛异常,然后比较性能,并行流因为有bug,所以这里我用反射把pipe的List实现arraylist改成了线程安全的list,并进行测试
我的布控对象测试数据解析后大概key有28w
实现方式 | 耗时 | 线程安全的list |
---|---|---|
并行流关闭自动flush | 平均10.08/s | |
并行流开启自动flush | 平均9.16/s | |
串行流关闭自动flush | 平均15.36/s | 平均16.20/s |
串行流开启自动flush | 平均6.74/s | 平均8.06/s |
可以看到官网推荐的自动每次执行就flush的性能更高些
lettuce设置timeout超时时间,spring.redis.timeout,我之前设置的是10s,可以自行调整
lettuce设置pipe的禁用自动刷新,这里需要重新构造LettuceConnectionFactory,然后设置PipelingFlushPolicy
我在官网找到了说明https://lettuce.io/core/release/reference/#_pipelining_and_co...
里面也说明了pipe默认每个命令在发出后都写入传输的原因,有兴趣的可以看看
android – admob 6.2.1 nullpointer异常
java.lang.NullPointerException at com.google.ads.AdView.onMeasure(SourceFile:670) at android.view.View.measure(View.java:15172) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4814) at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1390) at android.widget.LinearLayout.measureVertical(LinearLayout.java:681) at android.widget.LinearLayout.onMeasure(LinearLayout.java:574) at android.view.View.measure(View.java:15172) at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:617) at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:399) at android.view.View.measure(View.java:15172) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4814) at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) at android.view.View.measure(View.java:15172) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4814) at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1390) at android.widget.LinearLayout.measureVertical(LinearLayout.java:681) at android.widget.LinearLayout.onMeasure(LinearLayout.java:574) at android.view.View.measure(View.java:15172) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4814) at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1390) at android.widget.LinearLayout.measureVertical(LinearLayout.java:681) at android.widget.LinearLayout.onMeasure(LinearLayout.java:574) at android.view.View.measure(View.java:15172) at com.android.layoutlib.bridge.impl.RenderSessionImpl.measureView(RenderSessionImpl.java:542) at com.android.layoutlib.bridge.impl.RenderSessionImpl.render(RenderSessionImpl.java:444) at com.android.layoutlib.bridge.Bridge.createSession(Bridge.java:333) at com.android.ide.common.rendering.LayoutLibrary.createSession(LayoutLibrary.java:325) at com.android.ide.eclipse.adt.internal.editors.layout.gle2.RenderService.createRenderSession(RenderService.java:372) at com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart.renderWithBridge(GraphicalEditorPart.java:1638) at com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart.recomputeLayout(GraphicalEditorPart.java:1389) at com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart.activated(GraphicalEditorPart.java:1163) at com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate.delegatePageChange(LayoutEditorDelegate.java:674) at com.android.ide.eclipse.adt.internal.editors.common.CommonXmlEditor.pageChange(CommonXmlEditor.java:360) at org.eclipse.ui.part.MultiPageEditorPart$2.widgetSelected(MultiPageEditorPart.java:292) at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:248) at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053) at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1077) at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1062) at org.eclipse.swt.widgets.Widget.notifyListeners(Widget.java:774) at org.eclipse.swt.custom.CTabFolder.setSelection(CTabFolder.java:3023) at org.eclipse.swt.custom.CTabFolder.onMouse(CTabFolder.java:1730) at org.eclipse.swt.custom.CTabFolder$1.handleEvent(CTabFolder.java:270) at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053) at org.eclipse.swt.widgets.display.runDeferredEvents(display.java:4169) at org.eclipse.swt.widgets.display.readAnddispatch(display.java:3758) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$9.run(PartRenderingEngine.java:1022) at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:916) at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:86) at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:585) at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332) at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:540) at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149) at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:124) at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110) at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79) at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:353) at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:180) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(UnkNown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(UnkNown Source) at java.lang.reflect.Method.invoke(UnkNown Source) at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:629) at org.eclipse.equinox.launcher.Main.basicRun(Main.java:584) at org.eclipse.equinox.launcher.Main.run(Main.java:1438) at org.eclipse.equinox.launcher.Main.main(Main.java:1414)
这是xml文件
<RelativeLayout xmlns:tools="http://schemas.android.com/tools" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/backgroundapp" android:orientation="vertical" > <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_alignParentBottom="true" android:orientation="vertical" android:gravity="bottom" android:layout_width="fill_parent" android:layout_height="fill_parent"> <ListView android:id="@id/android:list" android:layout_width="fill_parent" android:layout_height="wrap_content" android:cacheColorHint="#00000000" android:textColor="#FFFFFF"/> <Button android:id="@+id/add_main_btn" android:layout_width="fill_parent" android:layout_height="match_parent" android:text="@string/add_serie" /> </LinearLayout> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:ads="http://schemas.android.com/apk/lib/com.google.ads" android:layout_alignParentTop="true" android:id="@+id/ad_layout" android:orientation="vertical" android:gravity="top" android:layout_width="fill_parent" android:layout_height="fill_parent"> <com.google.ads.AdView android:id="@+id/adView" android:layout_width="wrap_content" android:layout_height="wrap_content" ads:adUnitId="a15086a2a707a22" ads:adSize="BANNER" ads:loadAdOnCreate="true" /> </LinearLayout> </RelativeLayout>
在这里我的课
adView = new AdView(this,AdSize.BANNER,MY_AD_UNIT_ID); LinearLayout layout = (LinearLayout)findViewById(R.id.adView); layout.addView(adView); adView.loadAd(new AdRequest());
谢谢你的回复.
编辑:添加其他XML布局文件相同的错误
<RelativeLayout xmlns:tools="http://schemas.android.com/tools" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:ads="http://schemas.android.com/apk/lib/com.google.ads" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/backgroundapp" android:orientation="vertical"> <Button android:id="@+id/add_main_btn" android:layout_width="fill_parent" android:layout_height="70dp" android:layout_alignParentBottom="true" android:layout_alignParentLeft="true" android:text="@string/add_serie" /> <ListView android:id="@id/android:list" android:layout_width="fill_parent" android:layout_height="541dp" android:layout_alignParentLeft="true" android:cacheColorHint="#00000000" android:textColor="#FFFFFF" > </ListView> <com.google.ads.AdView android:id="@+id/adView" android:layout_width="wrap_content" android:layout_height="wrap_content" ads:adUnitId="a15086a2a707a22" ads:adSize="BANNER" ads:testDevices="TEST_EMULATOR" ads:loadAdOnCreate="true" />
EDIT2:
问题解决Admob 6.2.1有一个Android 4.1.2的错误,将Api布局设置为10或更低,有新的错误消息但不影响程序或广告
解决方法
与此同时,编辑原始XML或在代码中定义AdView也可以.
android – setSupportActionBar()抛出Nullpointer异常
http://www.android4devs.com/2014/12/how-to-make-material-design-app.html
但是在执行代码之后. logcat中显示以下错误:
04-01 19:16:10.214 2246-2253/com.example.bhaskar.ddit_results E/art﹕ Failed sending reply to debugger: broken pipe 04-01 19:16:11.985 2246-2246/com.example.bhaskar.ddit_results E/AndroidRuntime﹕ FATAL EXCEPTION: main Process: com.example.bhaskar.ddit_results,PID: 2246 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.bhaskar.ddit_results/com.example.bhaskar.ddit_results.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.CharSequence android.support.v7.widget.Toolbar.getTitle()' on a null object reference at android.app.ActivityThread.performlaunchActivity(ActivityThread.java:2298) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) at android.app.ActivityThread.access$800(ActivityThread.java:144) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5221) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.CharSequence android.support.v7.widget.Toolbar.getTitle()' on a null object reference at android.support.v7.internal.widget.ToolbarWidgetWrapper.<init>(ToolbarWidgetWrapper.java:95) at android.support.v7.internal.widget.ToolbarWidgetWrapper.<init>(ToolbarWidgetWrapper.java:88) at android.support.v7.internal.app.ToolbaractionBar.<init>(ToolbaractionBar.java:84) at android.support.v7.app.ActionBaractivityDelegateBase.setSupportActionBar(ActionBaractivityDelegateBase.java:175) at android.support.v7.app.ActionBaractivity.setSupportActionBar(ActionBaractivity.java:92) at com.example.bhaskar.ddit_results.MainActivity.onCreate(MainActivity.java:41) at android.app.Activity.performCreate(Activity.java:5933) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105) at android.app.ActivityThread.performlaunchActivity(ActivityThread.java:2251) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) at android.app.ActivityThread.access$800(ActivityThread.java:144) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5221) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
这是由NullPointerException引起的.我正在使用Android Studio 1.0.1.
styles.xml:
<resources> <!-- Base application theme. --> <style name="MyTheme" parent="MyTheme.Base"> </style> <style name="MyTheme.Base" parent="Theme.AppCompat.Light.NoActionBar"> <item name="colorPrimary">#ff32cd32</item> <item name="colorPrimaryDark">#ff04cd2c</item> <item name="colorAccent">#ff4081</item> </style>
V21 / styles.xml:
<resources> <style name="MyTheme" parent="MyTheme.Base"> <item name="android:windowContentTransitions">true</item> <item name="android:windowAllowEnterTransitionOverlap">true</item> <item name="android:windowAllowReturnTransitionOverlap">true</item> <item name="android:windowSharedElementEnterTransition">@android:transition/move</item> <item name="android:windowSharedElementExitTransition">@android:transition/move</item>
在toolbar.xml中我有:
<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="?attr/colorPrimary" app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" app:popupTheme="@style/ThemeOverlay.AppCompat.Light" android:elevation="4dp"/>
我还在activity_main.xml文件中包含了工具栏布局.
在MainActivity.java中:
public class MainActivity extends ActionBaractivity { .... private Toolbar toolbar; public static final int RECORD_ENTRY_REQUEST_CODE=3; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Set our view from the "main" layout resource toolbar = (Toolbar)findViewById(R.id.toolbar); //Toolbar will Now take on default actionbar characteristics setContentView(R.layout.activity_main); setSupportActionBar(toolbar); setTitle("DDIT_Results"); .... }
我搜索了这个问题并且没有提出任何解决方案.希望有人认识到这个错误并且有一个快速的答案 – 否则我可以提供更多的信息,如果要求.任何帮助将是appriciated.
解决方法
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // <-- call this first toolbar = (Toolbar) findViewById(R.id.toolbar); // <-- setup views after setSupportActionBar(toolbar); setTitle("DDIT_Results"); }
请参阅官方Android开发者博客:http://android-developers.blogspot.com/2014/10/appcompat-v21-material-design-for-pre.html
行动吧
To use Toolbar as an Action Bar,first disable the decor-provided
Action Bar. The easiest way is to have your theme extend from
Theme.AppCompat.NoActionBar (or its light variant).Second,create a Toolbar instance,usually via your layout XML:
<android.support.v7.widget.Toolbar android:id=”@+id/my_awesome_toolbar” android:layout_height=”wrap_content” android:layout_width=”match_parent” android:minHeight=”?attr/actionBarSize” android:background=”?attr/colorPrimary” />
The height,width,background,and so on are totally up to you; these
are just good examples. As Toolbar is just a ViewGroup,you can style
and position it however you want.Then in your Activity or Fragment,set the Toolbar to act as your
Action Bar:
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.blah); final Toolbar toolbar = (Toolbar) findViewById(R.id.my_awesome_toolbar); setSupportActionBar(toolbar); }
From this point on,all menu items are displayed in your Toolbar,populated via the standard options menu callbacks.
android – 在startIntentSenderForResult中的NullPointer,不适用V3
public void TipUs(){ String sku="tip_us"; try { Bundle buyIntentBundle = mService.getBuyIntent(3,getPackageName(),sku,"inapp","TIP_US"); PendingIntent pendingIntent = buyIntentBundle.getParcelable("BUY_INTENT"); startIntentSenderForResult(pendingIntent.getIntentSender(),1001,new Intent(),Integer.valueOf(0),Integer.valueOf(0)); } catch (remoteexception e) { e.printstacktrace(); } catch (SendIntentException e) { e.printstacktrace(); } } @Override protected void onActivityResult(int requestCode,int resultCode,Intent data) { if (requestCode == 1001) { int responseCode = data.getIntExtra("RESPONSE_CODE",0); String purchaseData = data.getStringExtra("INAPP_PURCHASE_DATA"); String dataSignature = data.getStringExtra("INAPP_DATA_SIGNATURE"); if (resultCode == RESULT_OK) { try { JSONObject jo = new JSONObject(purchaseData); String sku = jo.getString("productId"); } catch (JSONException e) { e.printstacktrace(); } } } }
如果我尝试再次使用相同的方法(根据Google Play中的设置应该可能的话),我会收到以下错误:
java.lang.NullPointerException at com.appiclife.tipcal.Tip_Calculator.TipUs(Tip_Calculator.java:521) at com.appiclife.tipcal.Tip_Calculator.onClick(Tip_Calculator.java:350) at android.view.View.performClick(View.java:2485) at android.view.View$PerformClick.run(View.java:9080) at android.os.Handler.handleCallback(Handler.java:587) at android.os.Handler.dispatchMessage(Handler.java:92) at android.os.Looper.loop(Looper.java:123) at android.app.ActivityThread.main(ActivityThread.java:3687) 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:867 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625) at dalvik.system.NativeStart.main(Native Method)
有没有人有错误,因为我使用了谷歌的演示,我应该改变什么?
编辑:
看起来mService是null(虽然奇怪的是,它工作了一次,所以看起来几乎像一个问题,如果你不止一次购买相同的项目).我有以下内容:
这是我的代码:
OnCreate() Intent("com.android.vending.billing.InAppBillingService.BIND"),mServiceConn,Context.BIND_AUTO_CREATE);
和:
IInAppBillingService mService; ServiceConnection mServiceConn = new ServiceConnection() { public void onServiceConnected(ComponentName name,IBinder service) { System.out.println("Test!"); mService = IInAppBillingService.Stub.asInterface(service); } public void onServicedisconnected(ComponentName name) { mService = null; } };
永远不会调用onServiceConnected.我在手册中没有看到这个:http://developer.android.com/google/play/billing/billing_integrate.html
但我尝试将以下服务添加到Manifest,没有结果(我再次删除它,我应该在那里声明服务吗?):
<service android:name="com.android.vending.billing.IInAppBillingService" />
解决方法
设置buyIntentBundle变量时,可以检查RESPONSE_CODE.如果RESPONSE_CODE为7,那么用户之前的购买需要由应用程序使用.
RESPONSE_CODE ID可以在这里找到:
http://developer.android.com/google/play/billing/billing_reference.html#billing-codes
使用以下示例代码查询购买的商品:
http://developer.android.com/google/play/billing/billing_integrate.html#QueryPurchases
在INAPP_PURCHASE_DATA_LIST中,数据是带有“purchasetoken”的JSON字符串.将此标记传递给CONSUME函数.
一旦您购买了消费品,用户就可以再次购买.
我们今天的关于使用for-each循环时LinkedList中的Nullpointer异常和for each in循环的分享就到这里,谢谢您的阅读,如果想了解更多关于30w+数据使用RedisTemplate的pipeline空指针NullPointerException异常分析、android – admob 6.2.1 nullpointer异常、android – setSupportActionBar()抛出Nullpointer异常、android – 在startIntentSenderForResult中的NullPointer,不适用V3的相关信息,可以在本站进行搜索。
本文标签: