В чем причина проблемы с переменной int? - PullRequest
0 голосов
/ 09 января 2020

У меня есть переменная в своем роде int. Я выделил значение в нем через другое значение из другого объекта, но есть проблема. Проблема возникает, когда я нажимаю кнопку 3 после того, как установил требуемые значения времени для каждого объекта.
Я покажу вам неправильное сообщение и используемый код. Я хочу изменить код для правильной работы.

    // Logcat:
      java.lang.NullPointerException: Attempt to read from field 'int com.ahmedco.testcode2.TimePickerDialog.hourOfDay' on a null object reference
            at com.ahmedco.testcode2.MainActivity$3.onClick(MainActivity.java:65)
            at android.view.View.performClick(View.java:6256)
            at android.view.View$PerformClick.run(View.java:24701)
            at android.os.Handler.handleCallback(Handler.java:789)
            at android.os.Handler.dispatchMessage(Handler.java:98)
            at android.os.Looper.loop(Looper.java:164)
            at android.app.ActivityThread.main(ActivityThread.java:6541)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

// class 1
    public class MainActivity extends AppCompatActivity {

        Button b1, b2, b3;
        DialogFragment timePickerDialog1, timePickerDialog2;
        int hourTimer1, hourTimer2, minuteTimer1, minuteTimer2;
        String time1Format, time2Format, AM_PMTimer1, AM_PMTimer2;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            b1 = (Button) findViewById(R.id.button);
            b2 = (Button) findViewById(R.id.button2);
            b3 = (Button) findViewById(R.id.button3);
            b1.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    timePickerDialog1 = new TimePickerDialog(1);
                    timePickerDialog1.show(getSupportFragmentManager(), "timePicker");
                }
            });
            b2.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    timePickerDialog2 = new TimePickerDialog(2);
                    timePickerDialog2.show(getSupportFragmentManager(), "timePicker");
                }
            });
            b3.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    hourTimer1 = ((TimePickerDialog) timePickerDialog1).hourOfDay;
                    hourTimer2 = ((TimePickerDialog) timePickerDialog2).hourOfDay;
                    minuteTimer1 = ((TimePickerDialog) timePickerDialog1).minute;
                    minuteTimer2 = ((TimePickerDialog) timePickerDialog2).minute;
                    AM_PMTimer1 = ((TimePickerDialog) timePickerDialog1).AM_PM;
                    AM_PMTimer2 = ((TimePickerDialog) timePickerDialog2).AM_PM;
                    //Log.i("trace1","test "+((TimePickerDialog) timePickerDialog1).hourOfDay);
                    //Log.i("trace2","test "+((TimePickerDialog) timePickerDialog2).hourOfDay);
                    time1Format = "" + hourTimer1 + ":" + minuteTimer1 + " " + AM_PMTimer1;
                    time2Format = "" + hourTimer1 + ":" + minuteTimer1 + " " + AM_PMTimer2;
                    Log.i("time1Format", "" + time1Format);
                    Log.i("time2Format", "" + time2Format);
                }
            });
        }
    }



// class 2

    public  class TimePickerDialog extends DialogFragment implements android.app.TimePickerDialog.OnTimeSetListener {

        public String AM_PM = "";
        public int hourOfDay = 0;
        public int minute = 0;

        public TimePickerDialog(int id) {
            // currentEditText = id;
        }

        @Override
        public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
            // Use the current time as the default values for the picker
            final Calendar c = Calendar.getInstance();
            int hour = c.get(Calendar.HOUR_OF_DAY);
            int minute = c.get(Calendar.MINUTE);
            return new android.app.TimePickerDialog(getActivity(), this, hour, minute, DateFormat.is24HourFormat(getActivity()));
        }

        @Override
        public void onTimeSet(TimePicker view, int hourOfDay_, int minute_) {
            // "11:06 PM"
            if (hourOfDay_ > 12) {
                AM_PM = "PM";
                hourOfDay_ = hourOfDay_ - 12;
            } else {
                AM_PM = "AM";
            }
            ///Log.i("hourOfDay",""+hourOfDay_+":"+hourOfDay_+" "+AM_PM);
            hourOfDay = hourOfDay_;
            minute = minute_;
        }

    }

Ответы [ 2 ]

1 голос
/ 09 января 2020

У вас проблема внутри b3.setOnClickListener, потому что вы не инициализированный объект, поэтому вам нужно инициализировать объекты timePickerDialog1 и timePickerDialog2 глобально.

  DialogFragment timePickerDialog1=new TimePickerDialog(1), timePickerDialog2=new TimePickerDialog(2);

или

     b3.setOnClickListener(new View.OnClickListener() {
          @Override
            public void onClick(View view) {
            if(timePickerDialog1==null)
                timePickerDialog1=new TimePickerDialog(1);

            if(timePickerDialog2==null)
                timePickerDialog1=new TimePickerDialog(2);

                hourTimer1 = ((TimePickerDialog) timePickerDialog1).hourOfDay;
                hourTimer2 = ((TimePickerDialog) timePickerDialog2).hourOfDay;
                minuteTimer1 = ((TimePickerDialog) timePickerDialog1).minute;
                minuteTimer2 = ((TimePickerDialog) timePickerDialog2).minute;
                AM_PMTimer1 = ((TimePickerDialog) timePickerDialog1).AM_PM;
                AM_PMTimer2 = ((TimePickerDialog) timePickerDialog2).AM_PM;
                //Log.i("trace1","test "+((TimePickerDialog) timePickerDialog1).hourOfDay);
                //Log.i("trace2","test "+((TimePickerDialog) timePickerDialog2).hourOfDay);
                time1Format = "" + hourTimer1 + ":" + minuteTimer1 + " " + AM_PMTimer1;
                time2Format = "" + hourTimer1 + ":" + minuteTimer1 + " " + AM_PMTimer2;
                Log.i("time1Format", "" + time1Format);
                Log.i("time2Format", "" + time2Format);
            }
        });
0 голосов
/ 09 января 2020

Вы объявляете свой TimePickerDialog в начале (DialogFragment timePickerDialog1, timePickerDialog2;)

Но инициализируйте его только при нажатии кнопки 1 или 2 соответственно timePickerDialog2 = new TimePickerDialog(2);

Поэтому timePickerDialog2 равно null до нажатия кнопки 2.

При попытке вызвать .hourOfDay в кнопке 3, когда timePickerDialog2 еще не инициализирован, вы получаете NullPointerException. Вы не можете вызывать методы для объекта, который является null.

...