【问题标题】:Android + java.lang.NullPointerException: Attempt to invoke interface methodAndroid + java.lang.NullPointerException:尝试调用接口方法
【发布时间】:2015-08-07 23:10:18
【问题描述】:

在编译我的代码时,我得到了这个错误(“java.lang.NullPointerException:尝试调用接口方法”),我仍然不知道为什么。

这是我的代码:

    public class FragmentDetails extends Fragment {

        private TextView text1, text2, text3, text4, text5 = null;
        private Button button1 = null;


        OnDetailsDefinedListener mCallback;

        public interface OnDetailsDefinedListener {
            void executeOrder(String a, String b, String c, String d, String e);
        }


        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

            rootView = inflater.inflate(R.layout.fragment_details, container, false);

            button1 = (Button) rootView.findViewById(...);

            button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                text1 = getActivity().findViewById(...);
                text2 = getActivity().findViewById(...);
                text3 = getActivity().findViewById(...);
                text4 = getActivity().findViewById(...);
                text5 = getActivity().findViewById(...);

                String a = text1.getText().toString();
                String b = text2.getText().toString();
                String c= text3.getText().toString();
                String d= text4.getText().toString();
                String e= text5.getText().toString();

                //this is where my error appears
                mCallback.executeOrder(a, b, c, d, e);
            }
            return rootView;
        }
    }

(这是我的错误信息)

    05-26 09:39:20.868    2916-2916/? E/AndroidRuntime﹕ FATAL EXCEPTION: main
        Process: com.example.blueHatCoder.myapplication, PID: 2916
        java.lang.NullPointerException: Attempt to invoke interface method 'void com.example.blueHatCoder.myapplication.FragmentDetails$OnDetailsDefinedListener.executeOrder(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String)' on a null object reference
        at com.example.blueHatCoder.myapplication.FragmentDetails$6.onClick(FragmentDetails.java:131)
        at android.view.View.performClick(View.java:4756)
        at android.view.View$PerformClick.run(View.java:19749)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        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)

提前谢谢你。

【问题讨论】:

  • mCallback 从未启动...

标签: java android nullpointerexception


【解决方案1】:

mCallback 从未启动。 你必须这样做:

mCallback = new OnDetailsDefinedListenerImpl(); 
mCallback.executeOrder(a, b, c, d, e);

mCallback = new OnDetailsDefinedListener(){
   @Override
   void executeOrder(String a, String b, String c, String d, String e){
     //doSomething
   };
}

【讨论】:

  • 事情是......因为我使用的是一个接口,目的是让实现它的活动拥有“做某事”的代码。另一件事是我在另一个片段上做了完全相同的事情(没有初始化 mCallback)并且它起作用了......
  • 没有。如果某事从未启动,您将获得 NPE。总是!
  • 你是对的......我的错误,我刚刚找到了我所缺少的。谢谢你的帮助:)
  • @BlueHatCoder 你错过了什么?我遇到了同样的问题,不明白为什么需要初始化 mCallback。
  • @StefanBeike 我无法初始化 mCallback = new OnDetailsDefinedListenerImpl()。我得到了问题: OnDetailsDefindedListenerImpl is abstract();无法实例化。我做错了什么?
【解决方案2】:

您的变量mCallback 已定义但未初始化。您必须先对其进行初始化,然后才能使用它。

【讨论】:

  • 即使我想在其中添加值,界面如何初始化。
【解决方案3】:

您应该向 FragmentDetails 类添加一个公共方法。

public setOnDetailsDefinedListener(OnDetailsDefinedListener listener) {
    mCallback = listener;
}

只需在调用者类中实现它。就像你在添加按钮监听器时所做的那样。

mFragmentDetails.setOnDetailsDefinedListener(new OnDetailsDefinedListener() {
// You code
})

【讨论】:

    【解决方案4】:

    也许你需要使用 onAttach(Activity activity) 片段方法

    public void onAttach(Activity activity){
        super.onAttach(activity);
        if(activity instanceof onSomeListener){
            mListener=(onSomeListener) activity;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-28
      • 2021-06-03
      • 1970-01-01
      • 1970-01-01
      • 2017-04-11
      • 2020-05-05
      • 2021-12-27
      相关资源
      最近更新 更多