2013-12-10 45 views
0

我在我的代碼中一直收到ClassCastException。最初的目標是將Set轉換爲List,因爲refreshDetailVOTable方法將只獲得Set。問題可能在於將Set轉換爲ListrefreshDetailVOTable可能採取了錯誤List這就是爲什麼我收到ClassCastException。對此有何想法?在事件派發期間發生異常:java.lang.ClassCastException

public List deleteChildPromotionComponentDetails(ClientContext context, List detailIRsToDelete, 
    String emergencyAccessPermission) throws RetekBusinessException { 

    List exclusionList = null; 
    RpmEvent deleteEvent = buildPromotionComponentDetailsDeleteEvent(emergencyAccessPermission); 
    deleteEvent.setTransitionNotificationExceptionFlag(true); 
    Set detailBOsToDelete = new HashSet(); 

    for (Iterator iDetails = detailIRsToDelete.iterator(); iDetails.hasNext();) { 
     IdentifiableReference detailIR = (IdentifiableReference) iDetails.next(); 

     PromotionComponentDetail promotionComponentDetail = (PromotionComponentDetail) getService() 
         .readForUpdate(detailIR); 
     Set exclusionSet = promotionComponentDetail.getExceptionsAndExclusions(); 

     exclusionList = new ArrayList (exclusionSet); 

     for(Iterator exclusion = exclusionSet.iterator(); exclusion.hasNext();){ 
      PromotionComponentDetail exclusionDel = (PromotionComponentDetail) exclusion.next(); 
      exclusionDel.accept(deleteEvent); 
      detailBOsToDelete.add(promotionComponentDetail); 
     } 

    } 
    return exclusionList; 
} 

public void deleteChildDetails(final List parentComponentDetails) 
{ 
    List list = null; 
    try { 
     list = getCmlPromotionComponentDetailAppService().deleteChildPromotionComponentDetails(
     ClientContext.getInstance(), parentComponentDetails, 
     emergencyPermission.getName()); 
    } catch (RetekBusinessException e) { 
     e.printStackTrace(); 
    } 
    refreshDetailVOTable(list); 
} 
+0

發佈您的錯誤堆棧跟蹤。 – user987339

+0

您正在使用所有原始類型。改用泛型。他們將幫助您在編譯時找到這種錯誤。 –

+0

我會嘗試一下,目前我正在研究仿製藥。你會有任何想法或示例什麼放在我的代碼編譯?謝謝@StuartMarks – awesome

回答

0

看看仿製藥的教程在這裏:

http://docs.oracle.com/javase/tutorial/java/generics/

你做的很簡單的東西,所以你只需要看看第一部分。你可能不需要潛入通配符。

一個猜測,發生的事情:你的方法接收參數List detailIRsToDelete從中得到一個迭代器和迭代,像這樣的元素:

for (Iterator iDetails = detailIRsToDelete.iterator(); iDetails.hasNext();) { 
    IdentifiableReference detailIR = (IdentifiableReference) iDetails.next(); 
    ... 
} 

如果誰打電話給你不小心把其他的東西比一個IdentifiableReference分成detailIRsToDelete,你會在循環中的賦值語句中得到ClassCastException。相反,如果列表參數被宣佈

List<IdentifiableReference> detailIRsToDelete 

將東西放入這個名單的行爲會被編譯器檢查,並會出現在其中添加了錯誤的對象,在編譯時間點的錯誤,而不是稍後在運行時,正如您所遇到的那樣。

+0

謝謝@StuartMarks。不過,我收到一個語法錯誤,它說參數類型只有在源級別爲1.5時纔可用。我們目前使用1.4。我們有任何解決方法嗎? – awesome

+0

哇,1.4。不,不能在1.4中使用泛型。我打算建議使用「checked」收集包裝(請參閱'Collections.checkedList(list,type)'以便在運行時進行檢查,以便在將錯誤類型的元素放入集合時捕獲錯誤。被檢查的包裝器也被添加到了1.5版中,也許這是你的項目升級的動力:新版本中增強的語言和庫功能有助於防止這樣的錯誤。 –

相關問題