发生RecordStoreFullException时出现奇怪的RecordStore行为

时间:2010-03-17 00:04:01

标签: java java-me midp recordstore

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

有时记录不能适合单个RecordStore,特别是在记录更新时 - 使用setRecord方法 - 发生RecordStoreFullException。我捕获异常,并尝试将记录写入新的RecordStore,同时删除旧RecordStore中的前一个记录。 一切正常,除了从RecordStore中删除RecordStoreFullException发生的记录。如果我尝试删除无法更新的记录,则抛出另一个类型为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发生时,count变量将被两种方法设置为1(如果RMS为空) - getNumRecords和numRecords。 System.out.println将生成NextID:0!这是不可接受的,因为记录ID不能为0! 有人可以解释这种奇怪的行为吗?

抱歉我的英语不好。

1 个答案:

答案 0 :(得分:0)

您确定setRecord会抛出RecordStoreFullException吗?

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

在我看来,Enumeration代码似乎证明了Sun和诺基亚RMS实现中的一个真正的错误(自从Series40使用KVM很长一段时间以来,这可能是同样的事情)。您可以通过查看Sun在https://phoneme.dev.java.net/的实现的源代码来确定它(假设它仍在那里)

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