Crashlytics прислал мне StackTrace, что я не понимаю, и что я не могу имитировать:Weird исключение в заявке подкласса
Fatal Exception: java.lang.NullPointerException
at lelisoft.com.lelimath.helpers.LeliMathApp.playSound(LeliMathApp.java:81)
at lelisoft.com.lelimath.fragment.PuzzleFragment$HandleClick.onClick(PuzzleFragment.java:158)
at android.view.View.performClick(View.java:4276)
LeliMath является андроида подкласс Application, который должен быть инициализирован только один раз. Я понимаю, что это своего рода синглтон. Код, в котором он терпит неудачу, инициализируется при создании и никогда не дублируется.
public class LeliMathApp extends Application {
private Map<Integer, Integer> mSounds = new HashMap<>();
private boolean soundEnabled;
public void onCreate() {
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
soundEnabled = sharedPref.getBoolean(GamePreferenceActivity.KEY_SOUND_ENABLED, true);
setSoundLevel(sharedPref.getInt(GamePreferenceActivity.KEY_SOUND_LEVEL, 50));
toggleSound(soundEnabled);
}
public void playSound(int resourceId) {
if (soundEnabled) {
int soundId = mSounds.get(resourceId); // NPE here
mShortPlayer.play(soundId, soundLevel, soundLevel, 0, 0, 1);
}
}
public void toggleSound(boolean state) {
log.debug("Toggle sound support");
if (! state && mShortPlayer != null) {
mShortPlayer.release();
mShortPlayer = null;
mSounds.clear();
} else if (state && mShortPlayer == null) {
if (Build.VERSION.SDK_INT >= 23) {
mShortPlayer = new SoundPool.Builder().build();
} else {
//noinspection deprecation
mShortPlayer = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);
}
mSounds.put(R.raw.correct, this.mShortPlayer.load(this, R.raw.correct, 1));
mSounds.put(R.raw.incorrect, this.mShortPlayer.load(this, R.raw.incorrect, 1));
mSounds.put(R.raw.victory, this.mShortPlayer.load(this, R.raw.victory, 1));
}
}
Это не может потерпеть неудачу на NPE, но это так. Есть идеи? Мне бы очень хотелось увидеть журналы, но я не знаю пользователя с этой ошибкой.
Update: это список вызовов этого метода
LeliMathApp.getInstance().playSound(R.raw.correct);
LeliMathApp.getInstance().playSound(R.raw.incorrect);
LeliMathApp.getInstance().playSound(R.raw.victory);
Откуда вы звоните 'playSound()'? – Rohit5k2
от onClick обработчик, см. Stacktrace –