Java 当您返回到FragmentActivity时,如何避免NullPointerException?

Java 当您返回到FragmentActivity时,如何避免NullPointerException?,java,android,android-fragments,Java,Android,Android Fragments,当我从另一个活动返回FragmentActivity时,我的堆栈跟踪。 我搜索了很多关于如何解决这个问题的信息,发现了一条需要保存片段状态的线索。 但在那篇线索文章中说,当我使用FragmentPagerAdapter时,我不需要保存状态 因此,我感到困惑。我是否正确使用FragmentPagerAdapter 请帮帮我 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.test20140

当我从另一个活动返回FragmentActivity时,我的
堆栈跟踪
。 我搜索了很多关于如何解决这个问题的信息,发现了一条需要保存片段状态的线索。 但在那篇线索文章中说,当我使用FragmentPagerAdapter时,我不需要保存状态

因此,我感到困惑。我是否正确使用FragmentPagerAdapter

请帮帮我

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.test20140320/com.example.test20140320.MainActivity}: java.lang.NullPointerException
   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2308)
   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2362)
   at android.app.ActivityThread.access$700(ActivityThread.java:168)
   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1329)
   at android.os.Handler.dispatchMessage(Handler.java:99)
   at android.os.Looper.loop(Looper.java:137)
   at android.app.ActivityThread.main(ActivityThread.java:5493)
   at java.lang.reflect.Method.invokeNative(Native Method)
   at java.lang.reflect.Method.invoke(Method.java:525)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1209)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1025)
   at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
   at com.example.test20140320.MainActivity_Fragment_Tab_02.<init>(MainActivity_Fragment_Tab_02.java:98)
   at java.lang.Class.newInstanceImpl(Native Method)
   at java.lang.Class.newInstance(Class.java:1130)
   at android.support.v4.app.Fragment.instantiate(Fragment.java:402)
   at android.support.v4.app.FragmentState.instantiate(Fragment.java:97)
   at android.support.v4.app.FragmentManagerImpl.restoreAllState(FragmentManager.java:1801)
   at android.support.v4.app.FragmentActivity.onCreate(FragmentActivity.java:213)
   at com.example.test20140320.MainActivity.onCreate(MainActivity.java:47)
   at android.app.Activity.performCreate(Activity.java:5372)
   at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1104)
   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2270)
   ... 11 more
java.lang.NullPointerException
   at com.example.test20140320.MainActivity_Fragment_Tab_02.<init>(MainActivity_Fragment_Tab_02.java:98)
   at java.lang.Class.newInstanceImpl(Native Method)
   at java.lang.Class.newInstance(Class.java:1130)
   at android.support.v4.app.Fragment.instantiate(Fragment.java:402)
   at android.support.v4.app.FragmentState.instantiate(Fragment.java:97)
   at android.support.v4.app.FragmentManagerImpl.restoreAllState(FragmentManager.java:1801)
   at android.support.v4.app.FragmentActivity.onCreate(FragmentActivity.java:213)
   at com.example.test20140320.MainActivity.onCreate(MainActivity.java:47)
   at android.app.Activity.performCreate(Activity.java:5372)
   at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1104)
   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2270)
   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2362)
   at android.app.ActivityThread.access$700(ActivityThread.java:168)
   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1329)
   at android.os.Handler.dispatchMessage(Handler.java:99)
   at android.os.Looper.loop(Looper.java:137)
   at android.app.ActivityThread.main(ActivityThread.java:5493)
   at java.lang.reflect.Method.invokeNative(Native Method)
   at java.lang.reflect.Method.invoke(Method.java:525)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1209)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1025)
   at dalvik.system.NativeStart.main(Native Method)

at com.example.test20140320.MainActivity_Fragment_Tab_02.<init>(MainActivity_Fragment_Tab_02.java:98)
我认为原因在于
savedInstanceState
,但不知道如何、如何以及如何

下面是我使用的
FragmentPagerAdapter
。 我认为这是最值得怀疑的部分

public class SectionsPagerAdapter extends FragmentPagerAdapter 
    {

        public SectionsPagerAdapter(FragmentManager fm)
        {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) 
        {
            // getItem is called to instantiate the fragment for the given page.
            // Return a DummySectionFragment (defined as a static inner class
            // below) with the page number as its lone argument.


            Fragment fragment = new DummySectionFragment();
            Bundle args = new Bundle();
            args.putInt(DummySectionFragment.ARG_SECTION_NUMBER, position + 1);
            fragment.setArguments(args);

            switch(position)
            {
            case 0:
                Fragment fragment_tab1 = new MainActivity_Fragment_Tab_02(getApplicationContext());
                fragment_tab1.setRetainInstance(true);

                return fragment_tab1;
            case 1:
                Fragment fragment_tab2 = new MainActivity_Fragment_Tab_01(getApplicationContext());
                fragment_tab2.setRetainInstance(true);
                return fragment_tab2;
            case 2:
                Fragment fragment_tab3 =  new MainActivity_Fragment_Tab_03(getApplicationContext());
                fragment_tab3.setRetainInstance(true);
                return fragment_tab3;

            }
            return fragment;
        }

        @Override
        public int getCount() {
            // Show 3 total pages.
            return 3;
        }

        @Override
        public CharSequence getPageTitle(int position) {
            Locale l = Locale.getDefault();
            switch (position) {
            case 0:
                return getString(R.string.title_section1).toUpperCase(l);
            case 1:
                return getString(R.string.title_section2).toUpperCase(l);
            case 2:
                return getString(R.string.title_section3).toUpperCase(l);
            }
            return null;
        }
    }
这个代码有漏洞吗?? 我是否正确使用FragmentPagerAdapter?OTL。。。。 我怎样才能修好它。。。。? 请帮帮我

注意:首次创建碎片活动成功。

移动

mContext = getActivity().getApplicationContext();

onatached
onActivityCreated

,代码的问题是您的活动正在其他地方崩溃,因此无法在片段类中获取活动引用。通过堆栈跟踪,整个日志,在您在此发布的日志之前的某个地方,将是导致活动停止的其他一些异常

为了在片段类中使用活动引用,请在片段中创建
mActivity
变量,并在使用之前检查NP
if(mActivity!=null)
。在片段类的
onatached
方法中初始化
mActivity

@Override
public void onAttach(Activity activity) {
    // TODO Auto-generated method stub
    super.onAttach(activity);
    mActivity = activity;
} 

我有过好几次这个问题。这是一种比赛状态。在使用getActivity()方法之前,只需检查(getActivity!=null){}。从那以后应该没事了。原因我不知道,但它在大多数情况下对我有效。否则,您可以调试代码并查看什么完全为null。除此之外,您不应该在片段构造函数中使用getActivity(),因为在调用onActivityCreated()之前,此方法将返回null。希望会help@Varundroid谢谢评论!我注意到片段构造函数在getActivity()中是不安全的,但当我在override onStart()方法中调用getActivity()时,它也只返回null。只需输入if(getActivity!=null),它就可以正常工作。之所以发生这种情况,是因为调用getActivity()时,片段没有被附加回活动。@Varundroid Thx,但“if(getActivity)”没有解决任何问题。。。我不能使用ApplicationContext。我在onStart()、onAttached()和onActivityCreated()上进行了测试,但都失败了。getActivity()返回null。
@Override
public void onAttach(Activity activity) {
    // TODO Auto-generated method stub
    super.onAttach(activity);
    mActivity = activity;
}