AsyncTask:ClassCastException:java.lang.Object []无法强制转换为java.lang.String []

Alk*_*gam 4 java android android-asynctask

在我的应用程序中,我为gcm ccs(xmpp)运行这些代码,代码显示以下错误执行时发生错误doinbackground.excute() 这是代码:

sendTask = new AsyncTask<String, String, String>() {
    protected String doInBackground(String... title) {

        Bundle data = new Bundle();
        data.putString("ACTION", action);
        data.putString("CLIENT_MESSAGE", "Hello GCM CCS XMPP!");
        String id = Integer.toString(ccsMsgId.incrementAndGet());

        try {
            Log.d("RegisterActivity", "messageid: " + id);
            gcm.send(SENDER_ID + "@gcm.googleapis.com", id,
                     data);
            Log.d("RegisterActivity", "After gcm.send successful.");
        } catch (IOException e) {
            Log.d("RegisterActivity", "Exception: " + e);
            e.printStackTrace();
        }
        return "Sent message.";
    }

    protected void onPostExecute(String result) {
        sendTask = null;
        // tosat about the success in return
    }
};

sendTask.execute(null, null, null);
Run Code Online (Sandbox Code Playgroud)

mar*_*inj 14

你是如何sendTask申报的?我想它只是AsyncTask sendTask;,如果是这样,那么改为:

AsyncTask<String, String, String> sendTask;
Run Code Online (Sandbox Code Playgroud)

此异常的原因类似于以下代码中出现的异常:

Object arr1[] = new Object[] {null,null,null};
String arr2[] = (String[])arr1; // here java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
Run Code Online (Sandbox Code Playgroud)

java中的varArgs是作为数组实现的,所以当你声明sendTask时,AsyncTask<String, String, String>编译器会调用你的doInBackgroundwith new String[]{null,null,null},但当你声明它时,AsyncTaskdoInBackground调用它new Object[]{null,null,null}.

由于类型擦除,编译器将添加隐藏的隐式强制Object[]转换String[].这是为了允许以下代码正常工作:

  AsyncTask sendTask = ...;
  Object[] arg = new String[]{null,null,null};
  sendTask.execute(arg);
Run Code Online (Sandbox Code Playgroud)

  • @AlkaNigam如果它与上述问题无关 - 那么如果你创建一个新问题会更好 (2认同)