【问题标题】:Java Arraylist/List errorJava Arraylist/List 错误
【发布时间】:2013-04-12 10:50:35
【问题描述】:

我已经标记了给我带来麻烦的行

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

DefaultListModel PatientListModel = new 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

【问题讨论】:

  • 与问题无关,但你不应该以大写字母开头你的变量名,遵循java指南非常重要。
  • @resus 虽然是的,但最好坚持正确的命名约定。它仍然没有任何问题会阻止代码工作。我只是建议本尼阅读此java.about.com/od/javasyntax/a/nameconventions.htm,因为使用正确的命名约定将有助于您在未来维护代码时获得大量时间。即使您只是在弄乱代码,也最好开始这样做。

标签: java exception netbeans arraylist


【解决方案1】:

我认为错误信息非常有用。你不能做那个演员。

您应该将PatientConditions3 重新定义为List&lt;PatientCondition&gt; 类型。最好针对接口List 而不是特定实现(如ArrayList)进行编码。此外,您应该重命名它以遵循 Java 命名约定:

List<PatientCondition> patientConditions3;

如果您需要将收到的List 转换为例如ArrayList,您可以使用收到的List 的元素创建一个新的:

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

【讨论】:

  • 但是我需要把它变成一个数组列表才能使用它?
  • @benny:添加了有关如何从收到的List 中获取ArrayList 的信息。
【解决方案2】:

Collections.emptyList() 返回一个 List 引用转换,该转换为 ArrayList 是非法的。

尝试更改此设置

ArrayList<PatientCondition> PatientConditions3 = new ArrayList();

到这里

List<PatientCondition> PatientConditions3 = new ArrayList();

【讨论】:

  • 如何将列表转换为 arraylist 以使用它?
【解决方案3】:

最有可能的是,方法ConditionsJList.getSelectedValuesList 的方法声明指定它返回一个List。您不能指望该列表将成为ArrayList

将变量PatientConditions3 的类型更改为List 而不是ArrayList。此外,如果您立即再次分配给PatientConditions3,则无需创建新的ArrayList 并将其分配给PatientConditions3;然后,您创建了 ArrayList,它会立即被丢弃。

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

另外说明:根据常见的 Java 编码约定,您不应该以大写字母开头的变量名。称它为patientConditions3 而不是PatientConditions3。 (这当然也适用于所有其他变量)。

【讨论】:

    【解决方案4】:

    如果List 变量后面实际上没有ArrayList,则不能将其转换为ArrayList。在大多数情况下,您应该为变量依赖接口以实现最大的灵活性

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

    关于类型安全:仅当您确实确定要转换的对象是目标类型的实例时才转换。在你施法之前用instanceof检查一下。

    【讨论】:

    • 我需要将它转换回数组列表才能使用它吗?
    • 如果您将 PatientConditions3 的类型更改为 List,则无需强制转换。 ArrayList 提供给客户端代码的大多数方法都是 List 接口的实现,所以在大多数情况下,您只需要 List 作为变量的类型
    【解决方案5】:

    当你有 ConditionsJList.getSelectedValuesList(); 时,你会得到一些值的集合(或 List,如果这听起来更好的话)。你只需要将它们转换为PatientCondition..所以你应该有类似的东西: PatientConditions3 = (PatientCondition) ConditionsJList.getSelectedValuesList();

    当然 PatientConditions3 必须是 List&lt;PatientCondition&gt; ...

    【讨论】:

      【解决方案6】:

      如果它是一个 ArrayList,它会为你做一个转换,否则 ArrayList 是空的:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-29
        • 2016-03-10
        • 1970-01-01
        • 2016-06-25
        • 2020-04-13
        相关资源
        最近更新 更多