GVKun编程网logo

使用for-each循环时LinkedList中的Nullpointer异常(for each in循环)

18

在这篇文章中,我们将为您详细介绍使用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循环)

使用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异常分析

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异常

android – admob 6.2.1 nullpointer异常

我有一个很大的问题,我想在我的 Android应用程序中集成admob但我在图形布局中得到一个nullpointer异常当我尝试将admob集成到xml文件中时

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或更低,有新的错误消息但不影响程序或广告

解决方法

查看AdView时onMeasure中的NullPointerException图形布局是一个已知问题.它将在下一个主要版本中修复.

与此同时,编辑原始XML或在代码中定义AdView也可以.

android – setSupportActionBar()抛出Nullpointer异常

android – setSupportActionBar()抛出Nullpointer异常

我是 android新手,我正在关注Material Design Toolbar的以下教程:
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.

解决方法

您需要在添加任何视图(如工具栏)之前调用setContentView.
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

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" />

解决方法

我遇到了同样的问题.在用户可以再次购买相同的SKU物品之前,您需要消费所购买的物品.

设置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的相关信息,可以在本站进行搜索。

本文标签: