匿名内部类中的NullPointerException

时间:2015-08-12 14:02:01

标签: java android nullpointerexception inner-classes anonymous-inner-class

我有一个简单的Android片段CreateAccountBookingFragment,它继承自CreateAccountFragment,具有以下方法:

@Override
public void onViewCreated(final View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    passwordTextView.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER))
                    || (actionId == EditorInfo.IME_ACTION_DONE)) {
                onSignUpClick();
            }
            return false;
        }
    });
}

方法onSignUpClick()CreateAccountBookingFragment中被覆盖。 最近发现了一个错误:

java.lang.NullPointerException
   at com.myapp.ui.auth.CreateAccountBookingFragment.onSignUpClick(CreateAccountBookingFragment.java:82)
   at com.myapp.ui.auth.CreateAccountFragment$1.onEditorAction(CreateAccountFragment.java:83)
   at android.widget.TextView.onEditorAction(TextView.java:4594)
   at com.android.internal.widget.EditableInputConnection.performEditorAction(EditableInputConnection.java:138)
   at com.android.internal.view.IInputConnectionWrapper.executeMessage(IInputConnectionWrapper.java:297)
   at com.android.internal.view.IInputConnectionWrapper$MyHandler.handleMessage(IInputConnectionWrapper.java:77)
   at android.os.Handler.dispatchMessage(Handler.java:99)
   at android.os.Looper.loop(Looper.java:175)
   at android.app.ActivityThread.main(ActivityThread.java:5279)
   at java.lang.reflect.Method.invokeNative(Method.java)
   at java.lang.reflect.Method.invoke(Method.java:511)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
   at dalvik.system.NativeStart.main(NativeStart.java)

我完全不理解如何抛出NullPointer。这意味着内部阶级仍然存在而外部不存在?我虽然不可能。谁能帮助我理解这里发生了什么?什么是解决方案。任何帮助赞赏。感谢。

发生错误的设备:Samsung GT P3113

更新: 方法onSingUpClick()在这里:

@SuppressWarnings("unused")
@OnClick(R.id.frag_auth_sign_up_btn) // line 82, this is ButterKnife annotation
protected void onSignUpClick() {

    String email = emailText.getText().toString().trim();
    String password = passwordText.getText().toString().trim();

    int errorMsg = 0;
    if (TextUtils.isEmpty(email)) {
        errorMsg = R.string.enter_email;
    } else if (!Utils.isValidEmail(email)) {
        errorMsg = R.string.invaild_email;
    } else if (TextUtils.isEmpty(password)) {
        errorMsg = R.string.enter_password;
    } else if (!Utils.isValidPassword(password)) {
        errorMsg = R.string.invaild_password;
    } else if (!NetworkUtils.isNetworkConnected(getActivity())) {
        errorMsg = R.string.network_not_connected;
    }

    if (errorMsg > 0) {
        ViewUtils.getInfoDialog(getActivity(), errorMsg).show();
    } else {
        showLoadingDialog();
        signUp(email, password);
    }
    ViewUtils.hideKeyboard(getActivity());
}

3 个答案:

答案 0 :(得分:2)

您可以从CreateAccountBookingFragment类发布signUp()函数的代码吗?您是否以某种方式在该方法中使用getActivity()

有时候getActivity()会返回null。这很可能是错误。所以在这种情况下,在getActivity()上添加一个空检查, 那就是:

if (getActivity()!=null){
    // only then do your singIn() method stuff 
}

答案 1 :(得分:1)

我有类似的问题。我很好奇我的'解决方案'是否适合你。这个问题也出现在Samsung GT P3113上。

我将匿名监听器移到了类本身,取消了内部类的访问器。对于你来说,这意味着将TextView.OnEditorActionListener添加到Fragment类定义的'implements'部分,然后在fragment类中实现onEditorAction()方法。这样,侦听器对象的生命周期始终与片段的生命周期相同。我知道,它不应该是一个问题,但是因为NPE在尝试使用访问器对象调用方法时发生..它似乎对我有效。

答案 2 :(得分:0)

也许你在CreateAccountBookingFragment类中使用的东西,从匿名内部类之外使用的任何变量必须是最终的,否则由于修剪而会出现问题。