【问题标题】:Weird RecordStore behavior when RecordStoreFullException occurs发生 RecordStoreFullException 时的奇怪 RecordStore 行为
【发布时间】:2010-05-13 04:41:51
【问题描述】:

我正在开发一个小型 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 发生时,计数变量将通过两种方法设置为 1(如果 RMS 为空) - getNumRecords 和 numRecords。 System.out.println 将产生 NextID: 0!这是不可接受的,因为记录 ID 不能为 0! 有人能解释一下这种奇怪的行为吗?

对不起,我的英语不好。

【问题讨论】:

    标签: java java-me midp recordstore


    【解决方案1】:

    你确定setRecord 抛出RecordStoreFullException

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

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

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

    【讨论】:

    • 是的。但这取决于您使用的模拟器/手机 - 在我真正的诺基亚 6233 上会发生这种行为 - 但您必须尝试使用​​ rawData 数组长度 - 有时它可能太小而不会导致异常。
    • addRecord 可能永远不会抛出异常,因为写入的字节数很少。
    • addRecord 可能实施得非常糟糕,足以引发异常。只需获取异常堆栈跟踪以确保是值得的。
    • 我确定不是——我提供的代码 sn-p 只是一个示例——必须调用 addRecord 才能将至少一条记录添加到存储中。 setRecord 调用导致异常 - 我使用逐步调试器模式检查了它。
    • 好的。看起来 RMS 实现在引发异常时没有正确失败。除了检查 PhoneME 的来源并尝试使用 Series60 之外,您仍然无能为力。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-17
    • 1970-01-01
    • 2012-04-29
    • 1970-01-01
    • 1970-01-01
    • 2010-12-13
    相关资源
    最近更新 更多