2013-04-12 60 views
0

我已標記行那給我找麻煩的Java數組列表/列表錯誤

private void EditButtonActionPerformed(java.awt.event.ActionEvent evt) {           

DefaultListModel PatientListModel =新DefaultListModel();

for (Patient s : PatientList) { 
    int AccNum = Integer.parseInt(IDTextField.getText()); 

    if (AccNum == s.getAccountNumber()) { 

     s.setName(NameTextField.getText()); 
     s.setAge(Integer.parseInt(AgeTextField.getText())); 
     s.setAddress(AddressTextField.getText()); 
     String PatientSex = ""; 

     if (MaleRadioButton.isSelected()) { 
      PatientSex = "Male"; 
     } 

     if (FemaleRadioButton.isSelected()) { 
      PatientSex = "Female"; 
     } 

     s.setSex(PatientSex); 
     s.setPhone(PhoneTextField.getText()); 
     ArrayList<PatientCondition> PatientConditions3 = new ArrayList(); 
    ===>  PatientConditions3 = (ArrayList<PatientCondition>) ConditionsJList.getSelectedValuesList(); //error here 
     s.setConditionsList(PatientConditions3); 
     PatientInfoLabel2.setText("Patient Details Updated"); 

     for (Patient f : PatientList) { 
      PatientListModel.addElement(f.getAccountNumber() + "-" + f.getName()); 
     } 

     PatientJList.setModel(PatientListModel); 
     UpdateAllViews(); 

     //  
    } 
} 
}         

的錯誤是:

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.util.Collections$EmptyList cannot be cast to java.util.ArrayList 
+0

與問題無關,但您不應該使用大寫啓動變量名,請遵循java指南,這非常重要。 –

+0

@resus,但是,堅持正確的命名約定會更好。它仍然沒有任何錯誤,將停止代碼工作。我只是建議benny閱讀這個http://java.about.com/od/javasyntax/a/nameconventions.htm,因爲使用正確的命名約定在將來維護代碼時將有助於您大展身手。即使你只是搞亂了代碼,開始這樣做也是不錯的做法。 – Popeye

回答

3

我認爲錯誤消息是相當翔實。你不能這樣做。

您應該重新定義您的PatientConditions3類型爲List<PatientCondition>。根據接口List而不是特定實現編碼是一種很好的做法,如ArrayList。此外,你應該將其重命名遵循Java的命名約定:

List<PatientCondition> patientConditions3; 

如果需要接收List轉換成例如一個ArrayList,您可以創建一個新的與接收到的List的元素:

patientConditions3 = new ArrayList<PatientCondition>(ConditionsJList.getSelectedValuesList()); 
+0

但我需要使它成爲一個數組列表才能使用它? – benny

+0

@benny:添加了關於如何從收到的List中獲取'ArrayList'的信息。 – Keppil

+0

感謝您的幫助! – benny

1

Collections.emptyList()返回一個List參考鑄造其中一個ArrayList是非法的。

嘗試修改此

ArrayList<PatientCondition> PatientConditions3 = new ArrayList(); 

這個

List<PatientCondition> PatientConditions3 = new ArrayList(); 
+0

如何將列表投射到ArrayList以使用它? – benny

0

一個List變量不能強制轉換爲ArrayList如果沒有實際上它背後ArrayList。在大多數情況下,你應該依靠接口爲您的變量,允許最大的靈活性

List<PatientCondition> PatientConditions3 = ConditionsJList.getSelectedValuesList(); 

關於類型的安全性:只有投,如果你真的肯定投的對象是目標類型的實例。在投射前用instanceof檢查一下。

+0

我需要將其轉換回數組列表才能使用它? – benny

+0

如果您將PatientConditions3的類型更改爲List ,則不需要投射。 ArrayList向客戶端代碼提供的大部分方法都是List接口的實現,所以在大多數情況下,List作爲變量的類型就是您所需要的 –

1

最可能的是,方法ConditionsJList.getSelectedValuesList的方法聲明指定它返回List。你不能指望這個清單將是一個ArrayList

將變量PatientConditions3的類型更改爲List而不是ArrayList。此外,如果您立即再次分配給PatientConditions3,則無需創建新的ArrayList並將其分配給PatientConditions3;然後你創建那個ArrayList沒有,它立即扔掉。

List<PatientCondition> PatientConditions3 = ConditionsJList.getSelectedValuesList(); 

另一種說法:根據常見的Java編碼約定,不應使用大寫字母開始變量名稱。稱它爲patientConditions3而不是PatientConditions3。 (這也適用於所有其他變量)。

0

當你有那裏ConditionsJList.getSelectedValuesList();你會得到一些值的集合(或列表<>如果這聽起來更好)。而你只需要施展他們是PatientCondition ..所以你應該有什麼樣: PatientConditions3 = (PatientCondition) ConditionsJList.getSelectedValuesList();

當然PatientConditions3必須List<PatientCondition> ...

0

這樣做對你投,如果它是一個ArrayList,否則ArrayList爲空:

ArrayList<PatientCondition> patientConditions3 = (ConditionsJList.getSelectedValuesList() instanceof ArrayList<PatientCondition> ? ((ArrayList<PatientCondition>) ConditionsJList.getSelectedValuesList()) : new ArrayList<PatientCondition>());