【问题标题】:Why am I getting a a null object reference error?为什么我收到空对象引用错误?
【发布时间】:2015-02-07 16:52:23
【问题描述】:

我试图在时间选择器中显示自定义的分钟间隔,所以这就是我想要做的。 在我的 MainActivity 中,我有这个方法(通过单击按钮调用),它正在打开一个 dDialogFragment:

public void showTimePickerDialog(View v) {
        DialogFragment newFragment = new TimePickerFragment();
        newFragment.show(getSupportFragmentManager(), "timePicker");
    }

这里是TimePickerFragment

public class TimePickerFragment extends DialogFragment
        implements DurationTimePickDialog.OnTimeSetListener {


    public Dialog onCreateDialog(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 = 0;

        // Create a new instance of CustomTimePickerDialog and return it
        return new CustomTimePickerDialog(getActivity(), this, hour, minute,
                DateFormat.is24HourFormat(getActivity()));
    }

    public void onTimeSet(TimePicker view, int hourOfDay, int minute) {

        String realMinute= "";

        switch (minute) {
            case 1:
                realMinute = "01";
                break;
            case 2:
                realMinute = "02";
                break;
            case 3:
                realMinute = "03";
                break;
            case 4:
                realMinute = "04";
                break;
            case 5:
                realMinute = "05";
                break;
            case 6:
                realMinute = "06";
                break;
            case 7:
                realMinute = "07";
                break;
            case 8:
                realMinute = "08";
                break;
            case 9:
                realMinute = "09";
                break;
            default:
                realMinute = String.valueOf(minute);
                break;
        }

        final String selectedDate = String.valueOf(hourOfDay) + ":" + realMinute;
        EditText selectedTimeTxt = (EditText) getActivity().findViewById(R.id.selectedTime);
        selectedTimeTxt.setText(selectedDate);
    }
}

如您所见,我使用了一个名为 CustomTimePickerDialog 的自定义类,以显示间隔为 10 分钟的对话框。代码如下:

public class CustomTimePickerDialog extends TimePickerDialog {

    private final static int TIME_PICKER_INTERVAL = 5;
    private TimePicker timePicker;
    private final OnTimeSetListener callback;

    public CustomTimePickerDialog(Context context, OnTimeSetListener callBack,
                                  int hourOfDay, int minute, boolean is24HourView) {
        super(context, callBack, hourOfDay, minute / TIME_PICKER_INTERVAL,
                is24HourView);
        this.callback = callBack;
    }

    @Override
    public void onClick(DialogInterface dialog, int which) {
        if (callback != null && timePicker != null) {
            timePicker.clearFocus();
            callback.onTimeSet(timePicker, timePicker.getCurrentHour(),
                    timePicker.getCurrentMinute() * TIME_PICKER_INTERVAL);
        }
    }

    @Override
    protected void onStop() {
    }

    @Override
    public void onAttachedToWindow() {
        super.onAttachedToWindow();
        try {
            Class<?> classForid = Class.forName("com.android.internal.R$id");
            Field timePickerField = classForid.getField("timePicker");
            this.timePicker = (TimePicker) findViewById(timePickerField
                    .getInt(null));
            Field field = classForid.getField("minute");

            NumberPicker mMinuteSpinner = (NumberPicker) timePicker
                    .findViewById(field.getInt(null));
            mMinuteSpinner.setMinValue(0);
            mMinuteSpinner.setMaxValue((60 / TIME_PICKER_INTERVAL) - 1);
            List<String> displayedValues = new ArrayList<String>();
            for (int i = 0; i < 60; i += TIME_PICKER_INTERVAL) {
                displayedValues.add(String.format("%02d", i));
            }
            mMinuteSpinner.setDisplayedValues(displayedValues
                    .toArray(new String[0]));
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}

问题是我遇到了这个奇怪的错误:

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.NumberPicker.setMinValue(int)' on a null object reference 关于这一行:mMinuteSpinner.setMinValue(0); - 在 CustomTimePickerDialog 类中。

我知道我在这里搞砸了(可能在 TimePickerFragment 类中),但作为一个 android 和 java 初学者,我无法发现我的错误。

你能给我一个线索吗?

【问题讨论】:

  • 如果您改为调用NumberPicker mMinuteSpinner = (NumberPicker) findViewById(field.getInt(timePicker)); 会怎样?也许Field field = TimePicker.class.getField("minute")
  • @AndyTurner Cannot resolve symbol 'timePicker'
  • this.timePicker 然后。
  • @AndyTurner this.timePicker 返回 null 并且 field 更改为 java.lang.NoSuchFieldException: minute

标签: java android android-dialogfragment android-timepicker


【解决方案1】:
NumberPicker mMinuteSpinner = (NumberPicker) timePicker
                .findViewById(field.getInt(null));

大概是返回null

【讨论】:

  • this.timePicker = (TimePicker) findViewById(timePickerField .getInt(null)); 返回结果。
  • @Slim - 总是? (我假设您的意思是“非空结果”)
  • 是的,总是。我不知道mMinuteSpinner 有什么问题 :(
  • @Slim - 在这种情况下,您需要提供更多信息(例如完整的堆栈跟踪)。错误消息表明您正在对NumberPickernull 实例调用setMinValue。这是您在给出的代码中唯一看起来调用该方法的地方。
  • 因为这是我唯一调用它的地方。 :) 但我仍然不明白为什么它返回 null。 :(
【解决方案2】:

android.widget.NumberPicker.setMinValue(int) 在空对象引用上 所以它说它是在 null 对象上调用的,这意味着 mMinuteSpinner 是 null 确保 JVM 不会出错,伙计,只需调试您的代码如果您需要帮助,我会帮助您调试

NumberPicker mMinuteSpinner = (NumberPicker) timePicker .findViewById(field.getInt(null));

        mMinuteSpinner.setMinValue(0);

【讨论】:

  • :) 我已经尝试过调试它并相信我,我什么也没看到... :(
  • mMinuteSpinner 是否有非空值?
  • 是的,所以你的对象是空的,基本上你的声明 Field field = classForid.getField("minute");不正确尝试获取所有可用字段的列表,然后查看 TimeDialogFragment 中是否有分钟
【解决方案3】:
LayoutInflater l = getLayoutInflater();
final View v = l.inflate(R.layout.create_alarm_dialog, null);

//get the number pickers
NumberPicker hoursNP = (NumberPicker) v.findViewById(R.id.hours);

这就是我的做法,我猜您需要指定视图,以便它知道在哪里查找 ID。抱歉,我也是 android 的菜鸟,这是我的第一个 stackover flow 帖子。我希望这会有所帮助。

【讨论】:

    【解决方案4】:
      mMinuteSpinner.setMinValue(0);
    

    致命异常:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“void android.widget.NumberPicker.setMinValue(int)”

    块引用

    在 android 版本 11 API 级别 30 中仍然崩溃,例如 Oppo、Samsung、Realme、OnePlus 等移动设备

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多