0

Hi i'm new in Android I'm getting Null point exception when configuration change occur in my app (portrait to landscape) this is my simple calculator App

My code in fragment is :


public class CalculatorFragment extends Fragment {

private TextView mTextViewString;
private boolean mLastNumeric;
private boolean mStateError;
private boolean mLastDot;

private Button mButtonDelete;
private Button mButtonOne;
private Button mButtonTwo;
private Button mButtonThree;
private Button mButtonFour;
private Button mButtonFive;
private Button mButtonSix;
private Button mButtonSeven;
private Button mButtonEight;
private Button mButtonNine;
private Button mButtonZero;
private Button mButtonSum;
private Button mButtonDivide;
private Button mButtonNegative;
private Button mButtonPoint;
private Button mButtonEqual;
private Button mButtonMultiply;


public CalculatorFragment() {

}


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

@Override
public void onSaveInstanceState(@NonNull Bundle outState) {
    super.onSaveInstanceState(outState);

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_calculator, container, false);
    findViews(view);
    setNumericOnClickListener();
    setOperatorOnClickListener();
    return view;
}

private void findViews(View view) {
    mTextViewString = view.findViewById(R.id.textView_show_number);
    mButtonDelete = view.findViewById(R.id.button_delete);
    mButtonOne = view.findViewById(R.id.button_one);
    mButtonTwo = view.findViewById(R.id.button_two);
    mButtonThree = view.findViewById(R.id.button_three);
    mButtonFour = view.findViewById(R.id.button_four);
    mButtonFive = view.findViewById(R.id.button_five);
    mButtonSix = view.findViewById(R.id.button_six);
    mButtonSeven = view.findViewById(R.id.button_seven);
    mButtonEight = view.findViewById(R.id.button_eight);
    mButtonNine = view.findViewById(R.id.button_nine);
    mButtonNegative = view.findViewById(R.id.button_negative);
    mButtonSum = view.findViewById(R.id.button_sum);
    mButtonDivide = view.findViewById(R.id.button_divide);
    mButtonMultiply = view.findViewById(R.id.button_multiply);
    mButtonZero = view.findViewById(R.id.button_zero);
    mButtonPoint = view.findViewById(R.id.button_point);
    mButtonEqual = view.findViewById(R.id.button_equal);
}

private void setNumericOnClickListener() {
    View.OnClickListener listener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Button button = (Button) v;
            if (mStateError) {
                mTextViewString.setText(button.getText());
                mStateError = false;
            } else {
                mTextViewString.append(button.getText());
            }
            mLastNumeric = true;

        }
    };
    
    mButtonZero.setOnClickListener(listener);
    mButtonOne.setOnClickListener(listener);
    mButtonTwo.setOnClickListener(listener);
    mButtonThree.setOnClickListener(listener);
    mButtonFour.setOnClickListener(listener);
    mButtonFive.setOnClickListener(listener);
    mButtonSix.setOnClickListener(listener);
    mButtonSeven.setOnClickListener(listener);
    mButtonEight.setOnClickListener(listener);
    mButtonNine.setOnClickListener(listener);

}

My Error Text in Android Studio is :


Attempt to invoke virtual method on a null object reference mButtonZero

java.lang.NullPointerException:com.example.calculator.controller.fragments.CalculatorFragment.setNumericOnClickListener(CalculatorFragment.java:107)

1 Answers1

0

Android kills objects when app goes away (opens another app) or have a configuration change (rotation, etc), so you have to be sure to get your objects instances right before using it.

As i can see in your code, on your "setNumericOnClickListener" method, you're trying to assign the "onClickListener" to each button object, but as they're set to null when app pauses or stops (rotate or opens another app), you should assure those objects are not null. I suggest you instantiate them on the "onResume" callback method.

You can learn more about the Android Activity LifeCycle Here: URL: https://developer.android.com/guide/components/activities/activity-lifecycle

You can learn more about the Android Fragment LifeCycle Here: https://developer.android.com/guide/components/fragments

And you can get more details on how does Fragments and Activities relates to each other here: When is onAttach called during the Fragment LifeCycle?

Ivan Verges
  • 595
  • 3
  • 10
  • 25