2014-05-08 44 views
0

我打電話給排氣但有ClassCast異常發生。下面我分享了代碼。我正在執行凌空爲Android,但我越來越ClassCastException

RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());    

//  StringRequest request = new StringRequest(Method.GET, "http://headers.jsontest.com/", listener, errorListener); 

     String url = "http://echo.jsontest.com/key/value"; 

     JsonObjectRequest jsObjRequest = new JsonObjectRequest(url, null, listener, errorListener); 
     requestQueue.add(jsObjRequest); 

Response.Listener<JSONObject> listener = new Response.Listener<JSONObject>() { 
     @Override 
     public void onResponse(JSONObject response) { 
      Log.d("","Success Response: " + response.toString()); 
     } 
    }; 


    Response.ErrorListener errorListener = new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
      if (error.networkResponse != null) { 
       Log.d("","Error Response code: " + error.networkResponse.statusCode); 
      } 
     } 
    }; 

爲什麼會出現這種異常,如何解決這個例外。

05-08 16:02:57.116: E/AndroidRuntime(16845): java.lang.ClassCastException: java.io.FileInputStream cannot be cast to java.io.ObjectInputStream 
05-08 16:02:57.116: E/AndroidRuntime(16845): at com.android.volley.toolbox.DiskBasedCache$CacheHeader.readHeader(DiskBasedCache.java:398) 
05-08 16:02:57.116: E/AndroidRuntime(16845): at com.android.volley.toolbox.DiskBasedCache.initialize(DiskBasedCache.java:157) 
05-08 16:02:57.116: E/AndroidRuntime(16845): at com.android.volley.CacheDispatcher.run(CacheDispatcher.java:85) 

/** 
     * Reads the header off of an InputStream and returns a CacheHeader object. 
     * @param is The InputStream to read from. 
     * @throws IOException 
     */ 
     public static CacheHeader readHeader(InputStream is) throws IOException { 
      CacheHeader entry = new CacheHeader(); 

      int magic = readInt(is); 
      if (magic != CACHE_MAGIC) { 
       // don't bother deleting, it'll get pruned eventually 
       throw new IOException(); 
      } 
      entry.key = readString(is); 
      entry.etag = readString(is); 
      if (entry.etag.equals("")) { 
       entry.etag = null; 
      } 
      entry.serverDate = readLong(is); 
      entry.ttl = readLong(is); 
      entry.softTtl = readLong(is); 
      **entry.responseHeaders = readStringStringMap((ObjectInputStream) is);**           return entry; 
     } 

在凌空的代碼斜體字部分是錯誤的,爲什麼是錯誤的。

+0

從logcat輸出中,很明顯你會使用'FileInputStream'實例,因爲它會是'ObjectInputStream'。調查(並分享)您的'readHeader'方法('DiskBasedCache#398')來查找問題。 – rekaszeru

+0

entry.responseHeaders = readStringStringMap((ObjectInputStream)is);這發生在第398行。在Volley庫中錯誤地完成了該演員。正確的方法是新的ObjectInputStream(是);這是一個錯誤。 – Ranjithkumar

回答

0

你唯一的例外是因爲你正嘗試將FileInputStream實例轉換爲ObjectInputStream,但這不是它的工作方式,你必須把它包起來:

final ObjectInputStream os = new ObjectInputStream(is); 
    entry.responseHeaders = readStringStringMap(os); 

例外說,你is參數實際上是一個FileInputStream,但是你不需要處理:知道它是一個InputStream的實現就足夠了,所以你可以在構造函數ObjectInputStream中使用它。

+0

爲什麼Android還沒有修復它?我是否使用了正確的庫 – Ranjithkumar

+0

修復了什麼?它是在輸入流的API文檔中編寫的,它們的目的是什麼,以及如何使用它們。你正在以一種不正確的方式使用它們,所以拋出了一個異常,這是你的工作來糾正它(按照它們的意圖使用這些類)。 – rekaszeru

+0

對不起,這是如何android排球使用它。它不是我的代碼,它是Volley庫中的代碼。我已經用抽象庫中的完整代碼更新了這個問題。 – Ranjithkumar