我正在开发一个显示公共汽车站时刻表的小型J2ME应用程序-它们以记录的形式存储在MIDP RecordStores中。
有时记录不能容纳单个RecordStore,特别是在使用setRecord方法的记录更新时,会发生RecordStoreFullException。我捕获了这个异常,并尝试在删除旧RecordStore中的前一个记录的同时,将记录写入新的RecordStore。除了从发生RecordStoreFullException的RecordStore中删除记录之外,其他一切都很正常。如果我尝试删除无法更新的记录,则会抛出另一个InvalidRecordIDException类型的异常。这在MIDP javadoc中很奇怪,而且没有文档记录。我已经在SunWTK2.5.2、MicroEdition SDK3.0和Nokia40系列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两个方法都会将计数变量设置为1(如果RMS为空)。System.out.println将生成NextID: 0!记录ID不能为0,不能接受!有人能解释一下这种奇怪的行为吗?
对不起,我的英语不好。
发布于 2010-03-17 20:25:53
你确定setRecord抛出RecordStoreFullException
如果addRecord抛出RecordStoreFullException,那么id永远不会更新,而您正在尝试deleteRecord(0),这可以解释InvalidRecordIDException。
在我看来,枚举代码演示了Sun和Nokia的RMS实现中的一个真正的bug (这可能是相同的,因为Series40使用KVM已经很长一段时间了)。您可以通过查看https://phoneme.dev.java.net/上的Sun实现的源代码来精确定位它(假设它仍然在那里
我建议在Series60手机上尝试同样的方法,因为它将包含由塞班开发的RMS实现。
https://stackoverflow.com/questions/2459072
复制相似问题