2016-06-15 2 views
0

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); 
+0

Откуда вы звоните 'playSound()'? – Rohit5k2

+0

от onClick обработчик, см. Stacktrace –

ответ

3

mSounds.get (RESOURCEID); возвращает null, когда ключ отсутствует в хэш-карте. Следовательно, исключение нулевого указателя.

Чтобы решить эту проблему, вам нужно сделать что-то подобное.

int soundId = -1; 

Integer tempSoundId = mSounds.get(resourceId); 
if(tempSoundId != null) 
    soundId = tempSoundId; 

Это ожидаемое поведение Java, так как мы пытаемся распаковывать в нулевое значение.

+0

Хорошая идея. Я думал, что mSounds является нулевым. Возможно, что resourceId не найден. –

+0

Надеюсь, это сработает для вас сейчас, и вы сможете имитировать его :) –

+0

да .. но просто попробуйте вызвать playSound с неправильным идентификатором ресурса, и вы узнаете, была ли это основной причиной проблемы. –

Смежные вопросы