首页 > 解决方案 > 如何修复此“int android.content.SharedPreferences.getInt”错误?

问题描述

我是编码新手,最近遇到一个错误,我找不到修复它的方法。我知道 NullPointerException 是什么,但我没有看到解决方案。是来自 GitHub 的代码(不是全部),所以不知道哪里出了问题。我试图记录自己。如果有人可以帮助我,我将不胜感激。

 Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'int android.content.SharedPreferences.getInt(java.lang.String, int)' on a null object reference


 public class RunningFragment extends Fragment implements SensorEventListener {

// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";

// TODO: Rename and change types of parameters
private String mParam1;
private String mParam2;

public RunningFragment() {
    // Required empty public constructor
}

//Activity Views
private TextView dayRecordText;
private TextView stepText;
private TextView timeText;
private TextView orientationText;
private TextView distanceText;
private TextView achievedText;
private TextView speedText;

//Preferences are used to remember the step record of the day
private SharedPreferences sharedPreferences;
private int dayStepRecord;


@RequiresApi(api = Build.VERSION_CODES.M)
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments() != null) {
        mParam1 = getArguments().getString(ARG_PARAM1);
        mParam2 = getArguments().getString(ARG_PARAM2);


        sensorManager = (SensorManager) getActivity().getSystemService(Context.SENSOR_SERVICE);
        stepDetectorSensor = sensorManager.getDefaultSensor(Sensor.TYPE_STEP_DETECTOR);
        accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        magnetometer = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);

        if (stepDetectorSensor == null)
            showErrorDialog();

        sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
    }
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_running, container, false);
    //Initialize views
    stepText = (TextView) view.findViewById(R.id.stepText);
    timeText = (TextView) view.findViewById(R.id.timeText);
    speedText = (TextView) view.findViewById(R.id.speedText);
    distanceText = (TextView) view.findViewById(R.id.distanceText);
    orientationText = (TextView) view.findViewById(R.id.orientationText);
    achievedText = (TextView) view.findViewById(R.id.achievedText);
    setViewDefaultValues();
}
@Override
public void onResume() {
    super.onResume();
    dayStepRecord = sharedPreferences.getInt(SettingsActivity.DAY_STEP_RECORD, 3) * 1000;
    dayRecordText.setText(String.format(getResources().getString(R.string.record), dayStepRecord));
}

标签: javaandroidsharedpreferences

解决方案


就放

sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getActivity());

外部if (getArguments() != null) {语句(右}括号后的下一行)onCreate

实际上,仅当您想使用这些参数(方法)时才应应用参数空值检查getArguments().getString(...),无论如何/始终都应启动传感器和共享首选项

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments() != null) {
        mParam1 = getArguments().getString(ARG_PARAM1);
        mParam2 = getArguments().getString(ARG_PARAM2);
    } // new closing bracket in here

        sensorManager = (SensorManager) getActivity().getSystemService(Context.SENSOR_SERVICE);
        stepDetectorSensor = sensorManager.getDefaultSensor(Sensor.TYPE_STEP_DETECTOR);
        accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        magnetometer = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);

        if (stepDetectorSensor == null)
            showErrorDialog();

        sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
    //} was here
}

推荐阅读