2011-02-19 89 views
2

当我运行我的程序,我不断收到类抛出异常错误,我不完全确定为什么。类演员异常问题

错误

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) 

现在如果我没有看错跟它的错误是在SmsReciever线45这将使这一问题区域。

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(); 

和偏好活动我已经计数定义为我之前展示,还试图把东西在字符串中但仍然是相同的结果

+0

试着做不是空字符串以外的字符串COUNT东西。我不知道为什么它会给你一个类演员例外,但我觉得这可能是你的问题。 – FoamyGuy 2011-02-19 06:21:39

回答

4

您在COUNT的偏好设置中存储什么?我想你可能已经将一些int值存储为一个字符串。

就像我觉得有这样的事情在你的代码:

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

,后来你在做一个prefs.getInt(COUNT),因为它是做,因为LAST和COUNT决心的应该失败同样的钥匙。

+0

不,我不使用putstring()只有putint()。我把我的代码放在了我的第一篇文章 – tyczj 2011-02-19 22:30:29

+0

中,我也评论说getInt()只是为了确保问题和程序运行正常,所以我不知道问题是什么 – tyczj 2011-02-20 05:20:12

3

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 

连接与调试您的应用程序,将断点上标线并查看调试器在您的COUNT密钥的allPrefs映射中显示的内容。

0

我通过从SharedPreferences声明字段中删除private来解决此问题。无论你存储的价值,但在这种情况下,你应该转换int值的字符串或者以上

0

提那些答案应该是这样使用:()

整数,后面跟着的ToString。它将允许将任何整数值分配给字符串。

例如:

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

您将得到类转换异常,所以你必须存储或转换的字符串,然后值的setText

String s= 19+""; 
mtextname.settext(s.tostring()); 
0

对于一些老机器人(< = 4)getBoolean,getInt,...的getString抛出ClassCastException - 如果你从来没有初始化,并保存变量。

这就是说,解决的办法是:

type foo; 
try{ 
    foo = sharedPreferences.getANYTING("name", defaultValue); 
} 
catch(ClassCastException e){ 
    foo = defaultValue; 
}