gpt4 book ai didi

java - 发生 RecordStoreFullException 时奇怪的 RecordStore 行为

转载 作者:行者123 更新时间:2023-12-01 05:57:23 27 4
gpt4 key购买 nike

我正在开发一个小型 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 设置为 1(如果 RMS 为空)。 System.out.println 将产生 NextID: 0!这是 Not Acceptable ,因为记录 ID 不能为 0!有人能解释一下这种奇怪的行为吗?

抱歉我的英语不好。

最佳答案

您确定setRecord抛出RecordStoreFullException吗?

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

在我看来,枚举代码似乎展示了 Sun 和 Nokia 的 RMS 实现中的一个真正的错误(这可能是相同的事情,因为 Series40 使用 KVM 很长一段时间)。您可以通过查看 Sun 实现的源代码 https://phoneme.dev.java.net/ 来查明它(假设它仍然存在)。

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

关于java - 发生 RecordStoreFullException 时奇怪的 RecordStore 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2459072/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com