2012-04-11 3 views
0

У меня очень неприятная проблема с SharedPreference.getBoolean в android. Смотрите следующий фрагмент кода:SharedPreferences.getBoolean, бросающий смешное исключение

Map<String, ?> all = preferences.getAll(); 

Object x = all.get("EnableMedia"); 

boolean v = preferences.getBoolean("EnableMedia", (Boolean) null); 

Я могу видеть в отладчике, что «х» является логическим, и это правда.

Однако, если я выполнил следующую строку, preferences.getBoolean, она выдает исключение. Что дает?!

+0

Это трудно понять, не видя исключение ... пожалуйста, прочитайте http://tinyurl.com/so-hints –

+0

Вы не можете установить примитивный тип (логическое) обнулить –

ответ

4

Посмотрите на этот призыв:

preferences.getBoolean("EnableMedia", (Boolean) null); 

Теперь посмотрим на подпись getBoolean:

public abstract boolean getBoolean (String key, boolean defValue) 

Обратите внимание, что это boolean значение, а не значение Boolean. Так что же на самом деле происходит, ваш код что-то вроде этого:

Boolean tmp = null; 
preferences.getBoolean("EnableMedia", tmp.booleanValue()); 

Это будет бросать NullPointerException как вы вызываете метод на нулевой ссылки.

Необходимо указать действительное значение boolean, например.

preferences.getBoolean("EnableMedia", true); 
+0

Вы правы, конечно, , Это разрешило эту проблему. Однако этот класс все еще кажется мне полностью разоренным. Он всегда возвращает значение, которое я передаю для defValue, даже несмотря на то, что на Карте явно есть запись, которая отличается. Я вижу то же поведение для целых чисел на Карте. – dsharlet

+2

@dsharlet: Учитывая ваш предыдущий анализ совершенно разумного исключения как «смешного», я не особенно склонен доверять вашему чувству диагностики. Что произойдет, если вы назовете 'contains'? –

+0

FYI, что Boolean cast был автоматически создан Eclipse, поэтому я бы не сказал, что это был вопрос дико из левого поля. В любом случае, я думаю, что решил эту проблему. Спасибо за вашу помощь. – dsharlet

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