Проблема исключения из класса - PullRequest
2 голосов
/ 19 февраля 2011

Я получаю ошибку исключения приведения класса, когда запускаю свою программу, и я не совсем уверен, почему.

ошибка

02-18 14:31:27.585: ERROR/AndroidRuntime(325): FATAL EXCEPTION: main
02-18 14:31:27.585: ERROR/AndroidRuntime(325): java.lang.RuntimeException: Unable to start receiver com.app.notifyme.SmsReciever: java.lang.ClassCastException: java.lang.String
02-18 14:31:27.585: ERROR/AndroidRuntime(325):     at android.app.ActivityThread.handleReceiver(ActivityThread.java:2821)
02-18 14:31:27.585: ERROR/AndroidRuntime(325):     at android.app.ActivityThread.access$3200(ActivityThread.java:125)
02-18 14:31:27.585: ERROR/AndroidRuntime(325):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2083)
02-18 14:31:27.585: ERROR/AndroidRuntime(325):     at android.os.Handler.dispatchMessage(Handler.java:99)
02-18 14:31:27.585: ERROR/AndroidRuntime(325):     at android.os.Looper.loop(Looper.java:123)
02-18 14:31:27.585: ERROR/AndroidRuntime(325):     at android.app.ActivityThread.main(ActivityThread.java:4627)
02-18 14:31:27.585: ERROR/AndroidRuntime(325):     at java.lang.reflect.Method.invokeNative(Native Method)
02-18 14:31:27.585: ERROR/AndroidRuntime(325):     at java.lang.reflect.Method.invoke(Method.java:521)
02-18 14:31:27.585: ERROR/AndroidRuntime(325):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
02-18 14:31:27.585: ERROR/AndroidRuntime(325):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
02-18 14:31:27.585: ERROR/AndroidRuntime(325):     at dalvik.system.NativeStart.main(Native Method)
02-18 14:31:27.585: ERROR/AndroidRuntime(325): Caused by: java.lang.ClassCastException: java.lang.String
02-18 14:31:27.585: ERROR/AndroidRuntime(325):     at android.app.ContextImpl$SharedPreferencesImpl.getInt(ContextImpl.java:2706)
02-18 14:31:27.585: ERROR/AndroidRuntime(325):     at com.app.notifyme.SmsReciever.onReceive(SmsReciever.java:45)
02-18 14:31:27.585: ERROR/AndroidRuntime(325):     at android.app.ActivityThread.handleReceiver(ActivityThread.java:2810)

Теперь, если я правильно понял, это говорит о том, что ошибка находится в строке 45 в SmsReciever, что делает эту область проблемной.

SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(context);
unread = pref.getInt(SmsPrefs.COUNT, 0);

У меня все определено как таковое

private int unread = 0;
//in preference class
public static final String COUNT = "";

Я просто пытаюсь использовать эту переменную для подсчета. Кто-то ведет меня сюда, потому что я действительно не вижу проблемы.

обновление ***

как код

public class SmsReciever extends BroadcastReceiver {

static final String ACTION = "android.provider.Telephony.SMS_RECEIVED";

NotificationManager notifyManag;

String mLast = new String();
private int unread = 0;

@Override
public void onReceive(Context arg0, Intent arg1) {

    boolean smsOn = false;
    String smsColor = new String ("Green");
    Uri smsSound;
    String smsVibrate = new String ("Normal");


    SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(arg0);

     smsOn = pref.getBoolean("PREF_SMS_ON", false);
     smsColor = pref.getString("SMS_PREF_COLOR", "Green");
     smsSound = Uri.parse(pref.getString("SMS_PREF_SOUND", "Silent"));
     smsVibrate = pref.getString("SMS_PREF_SOUND", "Normal");
     unread = pref.getInt(SmsPrefs.COUNT, 0);
     mLast = pref.getString(SmsPrefs.LAST, "");

       NotificationManager mNotificationManager = (NotificationManager) arg0.getSystemService(Context.NOTIFICATION_SERVICE);
        if (arg1.getAction().equals(ACTION) && smsOn == true){
            String from = new String();
            String body = new String();

            Bundle bundle = arg1.getExtras();
            if (bundle != null) {
                Object[] pdus = (Object[]) bundle.get("pdus");
                for (Object pdu : pdus){
                SmsMessage messages = SmsMessage.createFromPdu((byte[]) pdu);
                from = messages.getDisplayOriginatingAddress();
                body= messages.getDisplayMessageBody();
                }// end for
            }//end if

            int icon = 0;
            CharSequence tickerText = null;
            long when = 0;
            SharedPreferences.Editor editor = pref.edit();

            icon = icon(icon);
            tickerText = from + ": " + body;
            when = System.currentTimeMillis();
            CharSequence contentText = "";
            CharSequence contentTitle = "";

            /*
             if no notifications do normal
             else if notified >= 1 and last message is from same person display name and how many messages
             else if(notified >=1 and last message is from different display new message and how many
             */
            if(unread == 0){
                contentTitle = from;
                contentText = body.toString();
                unread = 1;
                editor.putInt(SmsPrefs.COUNT, unread);
                editor.commit();
            }else if(unread >= 1 && mLast.equals(from)){
                contentTitle = from;
                contentText = unread + " unread messages";
                unread++;
                editor.putInt(SmsPrefs.COUNT, unread);
                editor.commit();
            }else if(unread >= 1 && !mLast.equals(from)){
                contentTitle = "New Messages";
                contentText = unread + " unread messages";
                unread++;
                editor.putInt(SmsPrefs.COUNT, unread);
                editor.commit();
            }

            mLast = from;
            editor.putString(SmsPrefs.LAST, mLast);
            editor.commit();

и в операции с предпочтениями, которую я определил, как я показал ранее, также попытался вставить что-то в строку, но результат все тот же

Ответы [ 5 ]

4 голосов
/ 19 февраля 2011

Что вы храните в настройках COUNT?Я думаю, что вы, возможно, случайно сохранили некоторое значение типа int в виде строки.

Как я думаю, в вашем коде есть что-то подобное:

int a = 1;
prefs.putInt(COUNT, a);
String LAST = "";
prefs.putString(LAST, "NAME");
prefs.commit();
...

и позже вы выполняете префы.getInt (COUNT), который должен завершиться с ошибкой, как это происходит, потому что LAST и COUNT разрешают один и тот же ключ.

3 голосов
/ 21 февраля 2011

SharedPreferences.getInt() документы говорят:

Выдает ClassCastException, если есть предпочтение с этим именем, которое не int.

Итак, чтобы определить, что это такое:

Позвонить на getAll после SharedPreferences pref = Preferenc... как это:

SharedPreferences pref = Preferenc...
Map<String,?> allPrefs = pref.getAll();
Log.i("xx",allPrefs); // Dummy , put break point here

Подключитесь к своему приложению с помощью отладчика, установите точку останова на отмеченной строке и посмотрите, что отладчик показывает на карте allPrefs для вашего ключа COUNT.

0 голосов
/ 24 июня 2017

Для некоторых старых андроидов (<= 4) getBoolean, getInt, getString ... throw ClassCastException, если вы никогда не инициализировали и не сохранили переменную. </p>

Тем не менее, решение:

type foo;
try{
   foo = sharedPreferences.getANYTING("name", defaultValue);
}
catch( ClassCastException e ){
    foo = defaultValue;
}
0 голосов
/ 21 марта 2014

Везде, где вы храните значение, но в этом случае вам следует преобразовать строку значения int, или же выше упомяните, что ответ должен использоваться следующим образом:

целочисленное значение, за которым следует .tostring (). это позволит назначить любое целое значение в строку.

Например:

Textview mtxtname= new Textview(this);
mtxtname.setText(19);

Вы получите исключение приведения класса, поэтому вам нужно сохранить или преобразовать строку, а затем setText значения.

String s= 19+"";
mtextname.settext(s.tostring()); 
0 голосов
/ 10 апреля 2013

Я исправил эту проблему, удалив private из поля объявления SharedPreferences.

...