什么是java.lang.ClassCastException:java.util.ArrayList

时间:2012-01-09 09:08:51

标签: java android classcastexception

我的代码抛出java.lang.ClassCastException异常错误,为什么会出现此错误?我正在使用com.android.internal.telephony API。你可以在这里找到我正在使用的类Call.java <http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/1.5_r4/com/android/internal/telephony/Call.java>,CallManger.java <http://hi-android.info/src/com/android/internal/telephony/CallManager.java.html>我已经创建了一个Call.java的Subclaas,如下所示:

    public class MyCall extends Call{   

        CallManager cm = CallManager.getInstance(); 
        Phone.State state;
        Connection c;
         Phone mDefaultPhone;
         private final ArrayList<Connection> emptyConnections = new ArrayList<Connection>();    
         MyCall ringingCall;     

        @Override
        public List<Connection> getConnections() {          
            state = cm.getState();      
            ringingCall = (MyCall) cm.getRingingCalls();
            System.out.println("**inside getConnections="+ringingCall);     
            if ( ringingCall != null && !ringingCall.isIdle()) {
                System.out.println("**call is not null***");
                return ((MyCall) ringingCall).getConnections();
            }      
            else
            {
                System.out.println("**list is  null***");
                return emptyConnections;
            }       
        }

        @Override
        public Phone getPhone() {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public void hangup() throws CallStateException {
            // TODO Auto-generated method stub

        }

        @Override
        public boolean isMultiparty() {
            // TODO Auto-generated method stub
            return false;
        }

        public Connection
        getEarliestConnection() {
            System.out.println("inside EarliestConnection"); 
            List l;
            long time = Long.MAX_VALUE;
            Connection c;
            Connection earliest = null;

            l = getConnections();

            if (l == null) {
                return null;
            }else if ( l.size() == 0)
            {
                return null;
            }

            System.out.println("value of connection is=="+l); 
            for (int i = 0, s = l.size() ; i < s ; i++) {
                c = (Connection) l.get(i);
                long t;

                t = c.getCreateTime();

                if (t < time) {
                    earliest = c;
                    time = t;
                }
            }

        return earliest;
    }
}

我在自己的班级中调用了CallManger.java

CallManager cm = CallManager.getInstance();

我的另一个类是CallUpdate,它应该给我一个OutgoingCall状态(即其他电话是Busy,Power-off,not-reachable等)。代码是这样的:

public class CallUpdate {   

    Call myCall = new MyCall();
    Connection myConn = new MyConnection();
    CallManager cm = CallManager.getInstance();

        public Object getCallFailedString(){

           myConn = myCall.getEarliestConnection();
           System.out.println("myConn is  ******"+myConn);
           System.out.println("myCall is  ******"+myCall);  

           if(myConn == null){
                System.out.println("myConn is null ******");
                return null;
           }                
          else
            {
               Connection.DisconnectCause cause = myConn.getDisconnectCause();                       
               System.out.println("myconn is not null ******"+cause);   


                switch(cause){

                 case BUSY :
                   System.out.println("inside busy");
                 break;

                 case NUMBER_UNREACHABLE :
                    System.out.println("inside un-reachable");
                 break;

                case POWER_OFF :
                   System.out.println("inside power off");
                 break;  
              }
       }
    return myConn;
 }

我在BroadCastReceiver()中调用了这个类。但我得到的连接是空的。我的代码没有进入其他部分。所以我在MyCall类的getConnection方法中添加了一些代码,如下所示:

public List<Connection> getConnections() {      


     state = cm.getState();     
     ringingCall = (MyCall) cm.getRingingCalls();
         System.out.println("**inside getConnections="+ringingCall);        
          if ( ringingCall != null && !ringingCall.isIdle()) {
            System.out.println("**call is not null***");
            return ((MyCall) ringingCall).getConnections();
        }      
        else
        {
            System.out.println("**list is  null***");
            return emptyConnections;
        }   
    }

但是我收到java.lang.ClassCastException:on line:    ringingCall = (MyCall) cm.getRingingCalls(); 还有l = getConnection();   怎么解决这个? Thx提前。

2 个答案:

答案 0 :(得分:1)

更改您的代码如下

List<MyCall> ringingCall = cm.getRingingCalls();

我相信您的cm.getRingingCalls();返回ArrayList Call / MyCall

答案 1 :(得分:1)

getRingingCalls会返回List<Call>,即Call个对象的列表。您尝试将其转换为单个MyCall,而不是List,因此您获得了ClassCastException

您需要将类型更正为List

List<MyCall> ringingCall;
ringingCall = cm.getRingingCalls();

或者,使用列表中的第一个元素:

MyCall ringingCall;
if(!cm.getRingingCalls().isEmpty()){
    ringingCall = cm.getRingingCalls().get(0);
}