我正在尝试使用Java中的Native Query获取车辆的有序列表。
我使用两种方法,第一种获取车辆,第二种方法来订购列表。
我收到此错误:
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractList.set(AbstractList.java:132)
at java.util.AbstractList$ListItr.set(AbstractList.java:426)
at java.util.Collections.sort(Collections.java:159)
at Exercici4.AzizElamraniOrdreMatricula(Exercici4.java:246)
at Exercici4.main(Exercici4.java:45)
这是我的代码:
private static final String BBDDFITXER = "fitxer";
public static void main(String[] args)
{
new File(BBDDFITXER).delete();
ObjectContainer db = Db4oEmbedded.openFile(Db4oEmbedded.newConfiguration(), BBDDFITXER);
try {
Cotxe c3 = new Cotxe("B1432-hk", 10000, true);
Cotxe c1 = new Cotxe("B54w2-hk", 566666, true);
Cotxe c2 = new Cotxe("Bwc345-ABC", 13456, true);
Cotxe c4 = new Cotxe("Ba432th", 10000, true);
Moto m1 = new Moto("B5756474", 1000, 500);
Moto m2 = new Moto("6575-YT", 2345454, 250);
db.store(c3);
db.store(c1);
db.store(c2);
db.store(c4);
db.store(m1);
db.store(m2);
List<Vehicle> vehicles = AzizElamraniOrdreMatricula(db);
consultaVehicles(vehicles);
}finally{
db.close();
}
}
public static List<Vehicle> AzizElamraniNQ3(ObjectContainer db)
{
List<Vehicle> vehicles = db.query(new Predicate<Vehicle>()
{
public boolean match(Vehicle vehicle) {
return vehicle.getKm() < 50000
&& vehicle.getMatricula().startsWith("B");
}
});
return vehicles;
}
public static void consultaVehicles(List<Vehicle> vehicles) {
System.out.println("total: " + vehicles.size());
for (Vehicle v : vehicles) {
System.out.println(v.infoVehicle());
}
}
public static List<Vehicle> AzizElamraniOrdreMatricula(ObjectContainer db) {
List<Vehicle> vehiclesdes = AzizElamraniNQ3(db);
Collections.sort(vehiclesdes);
return vehiclesdes;
}
我做错了什么?
答案 0 :(得分:1)
您从db.query
获取的列表不是可修改的列表,Collections.sort
会修改列表以使其排序。要解决此问题,您可以创建一个新列表并对其进行排序。您的方法AzizElamraniOrdreMatricula
将如下所示:
public static List<Vehicle> AzizElamraniOrdreMatricula(ObjectContainer db) {
List<Vehicle> vehiclesdes = new ArrayList<Vehicle>(AzizElamraniNQ3(db));
Collections.sort(vehiclesdes);
return vehiclesdes;
}
答案 1 :(得分:0)
是的,正确的db.query
正在返回固定列表。请参阅下面的示例,它将抛出java.lang.UnsupportedOperationException:
public class UnsupportedExceptionDemo {
public static void main(String[] args) {
String[] valStrings = { "Java", "Unsupported", "Test" };
List<String> list = Arrays.asList(valStrings);
for (Iterator<String> iterator = list.iterator();
iterator.hasNext();) {
String string = iterator.next();
iterator.remove();
}
}
}
原因:当调用Arrays.asList(String ... a)方法时,它返回由指定数组支持的固定大小列表,因此当您尝试修改列表时,即从中添加或删除值将抛出UnsupportedOperationException。要修复它,请使用LinkedList