我正在尝试使以下代码正常运行,而没有警告或错误。问题是,如果我保留泛型类型,它将在eclipse中返回警告。当我想到删除警告的代码时,我使用了显式类,并遇到了一个问题,其中Architecture.getValues()
必须返回Architecture[]
,而我似乎无法强制转换。我读到如果将空的Architecture[]
传递给collections方法(.toArray()
)会填充它,但似乎无法正确执行,由于java.lang.NullPointerException
异常,我在注释行中遇到了运行时错误。我怎样才能做到这一点?
Main.java
//snippet
private JComboBox<Architecture> comboBox_3;
//snippet
comboBox_3.setModel(new DefaultComboBoxModel<Architecture>(Architecture.getValues(perf)));
架构Java
public enum Architecture {
CATEGORYb, CATEGORY1, CATEGORY2, CATEGORY3, CATEGORY4;
public static Architecture[] getValues(Performance perf) {
ArrayList<Architecture> categories = new ArrayList<Architecture>();
Architecture[] empty = null;
switch (perf) {
case PLa:
categories.add(CATEGORYb);
categories.add(CATEGORY2);
break;
case PLb:
categories.add(CATEGORYb);
categories.add(CATEGORY2);
categories.add(CATEGORY3);
break;
case PLc:
categories.add(CATEGORY1);
categories.add(CATEGORY2);
categories.add(CATEGORY3);
break;
case PLd:
categories.add(CATEGORY2);
categories.add(CATEGORY3);
break;
case PLe:
categories.add(CATEGORY4);
break;
}
return categories.toArray(empty); //runtime error
}
}
Performance.java
public enum Performance {
PLa, PLb, PLc, PLd, PLe;
}
最佳答案
传入数组的作用不只是提供类型。如果足够大,则该数组将被填充并返回。如果不够大,则将分配,填充和返回相同类型的新数组。因为它是null
,所以会抛出NullPointerException
。 toArray
Javadocs中描述了此行为:
如果列表适合指定的数组,则将其返回。否则,将使用指定数组的运行时类型和此列表的大小分配一个新数组。
和
NullPointerException-如果指定的数组为null
不用传递null
数组,只需初始化一个数组,其长度为列表的大小。
return categories.toArray(new Architecture[categories.size()]);