线程“main”java.lang.UnsupportedOperationException中的异常

时间:2014-02-27 16:21:29

标签: java db4o nativequery

我正在尝试使用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;
 }

我做错了什么?

2 个答案:

答案 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