【问题标题】:What is the cause of the int variable problem?int变量问题的原因是什么?
【发布时间】:2020-01-09 15:03:45
【问题描述】:

我有一个 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_;
        }

    }

【问题讨论】:

    标签: java android nullpointerexception


    【解决方案1】:

    您在b3.setOnClickListener 内部遇到问题,因为您没有初始化对象,因此您必须全局初始化对象timePickerDialog1timePickerDialog2

      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);
                }
            });
    

    【讨论】:

      【解决方案2】:

      您在开头声明您的 TimePickerDialog
      (DialogFragment timePickerDialog1, timePickerDialog2;)

      但仅在分别按下按钮 1 或 2 时才初始化它
      timePickerDialog2 = new TimePickerDialog(2);

      因此timePickerDialog2null直到按钮2被按下。

      timePickerDialog2 尚未初始化时尝试在按钮 3 中调用 .hourOfDay 时,您会得到一个 NullPointerException。您不能在 null 的对象上调用方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-10
        • 1970-01-01
        • 2011-09-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多