RecordStoreFullException

RecordStoreFullException

我正在开发一个小的J2ME应用程序,该应用程序显示公交车站的时间表-它们作为记录存储在MIDP RecordStores中。

有时记录不能容纳单个RecordStore,尤其是在记录更新时-使用setRecord方法-发生RecordStoreFullException。我捕获到异常,并尝试将记录写入新的RecordStore并删除旧的RecordStore中的前一个。
除了从发生RecordStoreFullException的RecordStore中删除记录以外,其他所有操作都正常。如果我尝试删除无法更新的记录,则会引发另一个InvalidRecordIDException类型的异常。这很奇怪,在MIDP javadoc中没有记录。我已经在Sun WTK 2.5.2,MicroEdition SDK 3.0和Nokia Series 40 SDK上进行了测试。此外,我创建了一个代码来再现这种奇怪的行为:


RecordStore rms = null;
        int id = 0;
        try {
            rms  = RecordStore.openRecordStore("Test", true);
            byte[] raw = new byte[192*10024]; //Big enough to cause RecordStoreFullException
            id = rms.addRecord(raw, 0, 160);
            rms.setRecord(id, raw, 0, raw.length);
        } catch (Exception e) {
            try {
                int count = rms.getNumRecords();
                RecordEnumeration en = rms.enumerateRecords(null, null, true);
                count = en.numRecords();
                while(en.hasNextElement()){
                    System.out.println("NextID: "+en.nextRecordId());
                }
                rms.deleteRecord(id); //this won't work!
                rms.setRecord(id, new byte[5], 0, 5); //this won't work too!
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }


我添加了额外的枚举代码,以产生其他奇怪的行为-发生RecordStoreFullException时,两种方法-getNumRecords和numRecords会将count变量设置为1(如果RMS为空)。 System.out.println将产生NextID:0!这是不可接受的,因为记录ID不能为0!
有人可以解释这种奇怪的行为吗?

对不起,我的英语不好。

最佳答案

您确定setRecord抛出RecordStoreFullException吗?

如果addRecord抛出RecordStoreFullException,则id永远不会更新,而您正在尝试deleteRecord(0),这可能会解释InvalidRecordIDException

在我看来,枚举代码似乎演示了Sun和诺基亚在RMS实施中的真实错误(这可能是相同的,因为Series40长期使用KVM)。您可以通过在https://phoneme.dev.java.net/处查看Sun实现的源代码来查明它(假设它仍然存在)。

我建议您在Series60手机上尝试相同的操作,因为它将包含由Symbian开发的RMS实现。

07-26 07:07