2010-05-20 60 views
3

我跟蹤了一個正在開發的應用程序的問題,它給了我一個類型轉換異常。有趣的是,它說它不能投「實體。電影不能投到實體。電影」?!電影是一個ArrayList。用java爲每個循環輸入類型轉換問題

try { 
     movies = getMovies(); 
    } catch (Exception e) { 
     e.printStackTrace(System.out); 
    } finally { 
     try { 
      for (Movie movie : movies) { 
       output.append("     <tr>\n"); 
       output.append("      <td>" + movie.getId() + "</td>"); 
       output.append("     </tr>\n"); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(System.out); 
     } 
    } 
+0

同意佩特,換句話說,檢查您的進口 – 2010-05-20 14:31:29

+0

聽起來像一個網絡應用程序。如果這是真的,1)不要打印異常,丟棄它們。 2)不要在servlet /業務層中打印HTML,請使用JSP。 – BalusC 2010-05-20 14:35:02

回答

7

聽起來像是類加載器衝突。由不同類加載器加載的相同類定義被JVM視爲兩個不同的類。

有了這個小小的信息,就沒有什麼可說的了。有關類加載器及其問題的詳細信息,請參見this article

另請參閱此earlier answer of mine to a similar problem

4

可能是一個類加載器的問題(如果你的應用有一個以上)

在一個調試器,看看從的getClass(類對象)呼籲電影中的一員,並把它比作是爲本地構造的Movie對象。

如果他們不同,這可能會讓你跟蹤發生了什麼。類對象將允許您查看哪個類裝入器已加載定義。

如果您加載了兩個不同的類定義,則需要跟蹤您的JAR文件加載兩次的位置。

0

除了類加載器的問題,我懷疑你也在做一些涉及Collection<Movie>實例或類似的地方的不安全類型轉換。

0

檢查兩個類是否使用相同版本的Java編譯。

+1

類可以用不同的版本進行編譯而不會導致'ClassCastException'。如果使用更新的版本進行編譯並嘗試在早期的JVM上運行,您將得到一個'UnsupportedClassVersionError'。 – 2010-05-20 10:32:08

+0

啊,是的,這是正確的。 – 2010-05-20 10:58:00

0

我也懷疑一個類加載器的問題,但你也可以檢查你沒有serialversionuid問題。

0

另一種可能性是,如果您有任何代碼生成(例如來自ORM),則IDE與磁盤上的文件不一致,在這種情況下,刷新IDE項目並執行清理生成可能會有所幫助。

如果不是,你是否確實有兩個在不同包中具有相同名稱的類?如果是這樣,它可能是一個試圖從一個到另一個投射,因爲你已經導入了「錯誤」的一個。