NullPointerException bei onSharedPreferenceChanged

  • Antworten:1
Robbiani Renato
  • Forum-Beiträge: 650

08.11.2024, 21:17:18 via Website

Hallo zusammen

Meine App hat Optionen. Diese verwalte ich mit SharedPreference. Wenn ich bereits Optionen vorhanden sind, dann läuft die Methode "onSharedPreferenceChanged" ohne Probleme.

 @Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
    Map<String, ?> map_key;
    Object pool_key;
    Preference wo = findPreference(key);
    map_key = sharedPreferences.getAll();
    if((wo != null) && (map_key != null)) {
        pool_key = map_key.get(key);
        if(pool_key.getClass().isInstance("class.java.lang.String")) {
            wo.setSummary(sharedPreferences.getString(key, " - "));
        }
    }
}

Wenn ich aber eine neuinstallation mache und die Optionen das erste mal aufrufe, dann kommt ein hässlicher Fehler:

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Class java.lang.Object.getClass()' on a null object reference

Wie kann ich verhindern, dass dieser Fehler nicht mehr auftritt?

package ch.robbisoft.sakristanhilfe;

import android.content.SharedPreferences;
import android.os.Bundle;

import androidx.preference.Preference;
import androidx.preference.PreferenceFragmentCompat;

import java.util.Map;

public class SettingsFragment extends PreferenceFragmentCompat implements SharedPreferences.OnSharedPreferenceChangeListener {
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
addPreferencesFromResource(R.xml.preferences);
//Eingabe anzeigen
onSharedPreferenceChanged(getPreferenceManager().getSharedPreferences(), "key_termin_titel");
onSharedPreferenceChanged(getPreferenceManager().getSharedPreferences(), "key_terminbeschrieb");
onSharedPreferenceChanged(getPreferenceManager().getSharedPreferences(), "key_terminort");
onSharedPreferenceChanged(getPreferenceManager().getSharedPreferences(), "key_vor");
onSharedPreferenceChanged(getPreferenceManager().getSharedPreferences(), "key_nach");
}

@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
    Map<String, ?> map_key;
    Object pool_key;
    Preference wo = findPreference(key);
    map_key = sharedPreferences.getAll();
    if((wo != null) && (map_key != null)) {
        pool_key = map_key.get(key);
        if(pool_key.getClass().isInstance("class.java.lang.String")) {
            wo.setSummary(sharedPreferences.getString(key, " - "));
        }
    }
}

@Override
public void onResume() {
    super.onResume();
    getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
}

@Override
public void onPause() {
    getPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
    super.onPause();
}

}

Gruss Renato

Kommentieren
Robbiani Renato
  • Forum-Beiträge: 650

09.11.2024, 10:20:11 via Website

Hallo zusammen

Ich löse das Problem mit einer Prüfung auf "null".

 @Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
    Map<String, ?> map_key;
    Object pool_key;
    Preference wo = findPreference(key);
    map_key = sharedPreferences.getAll();
    if((wo != null) && (map_key != null)) {
        pool_key = map_key.get(key);
        if(pool_key != null) {
            if (pool_key.getClass().isInstance("class.java.lang.String")) {
                wo.setSummary(sharedPreferences.getString(key, " - "));
            }
        }
    }
}

So geht es, ist das aber auch die eleganteste Lösung?

Gruss Renato

Hilfreich?
Kommentieren