在j2me和NetBeans中运行相同的代码时获得不同的输出

Soh*_*tel 3 rms netbeans midp java-me

在j2me和NetBeans中运行以下代码:

此代码用于记录过滤(搜索记录)。

问题在于,当我们在j2me中运行此代码时,它从头开始执行搜索,而在NetBeans中则是从反向开始搜索。

        import javax.microedition.rms.*;
        import javax.microedition.midlet.*;
        import javax.microedition.lcdui.*;
        import java.io.*;
        import javax.microedition.rms.RecordFilter;
        public class SearchExample extends MIDlet implements CommandListener
        {
        private Display display;
        private Alert alert;
        private Form form;
        private Command exit;
        private Command start;
        private RecordStore recordstore = null;
        private RecordEnumeration recordEnumeration = null;
        private Filter filter = null;
        public SearchExample ()
        {
        display = Display.getDisplay(this);
        exit = new Command("Exit", Command.SCREEN, 1);
        start = new Command("Start", Command.SCREEN, 1);
        form = new Form("Mixed RecordEnumeration", null);
        form.addCommand(exit);
        form.addCommand(start);
        form.setCommandListener(this);
        }
        public void startApp()
        {
        display.setCurrent(form);
        }
        public void pauseApp()
        {
        }
        public void destroyApp( boolean unconditional )
        {
        }
        public void commandAction(Command command, Displayable displayable)
        {
        if (command == exit)
        {
        destroyApp(true);
        notifyDestroyed();
        }
        else if (command == start)
        {
        try
        {
        recordstore = RecordStore.openRecordStore("myRecordStore", true );
        }
        catch (Exception error)
        {
        alert = new Alert("Error Creating",error.toString(), null, AlertType.WARNING);
        alert.setTimeout(Alert.FOREVER);
        display.setCurrent(alert);
        }
        try
        {
        String outputData[] = {"Mary", "Adam","dancebob","bobby","bob1"};
        for (int x = 0 ; x < outputData.length; x++)
        {

        byte[] byteOutputData = outputData[x].getBytes();
        recordstore.addRecord(byteOutputData, 0,byteOutputData.length);
        }
        }
        catch ( Exception error)
        {
        alert = new Alert("Error Writing",error.toString(), null, AlertType.WARNING);
        alert.setTimeout(Alert.FOREVER);
        display.setCurrent(alert);
        }
        try
        {
        filter = new Filter("Bob");
        StringBuffer sbuf=new StringBuffer();
        recordEnumeration = recordstore.enumerateRecords(filter, null, false);
        if (recordEnumeration.numRecords() > 0)
        {
        for(int i=0;i<recordEnumeration.numRecords();i++){
        String string = new String(recordEnumeration.nextRecord());
        sbuf.append(string+"\n");
        }

        alert = new Alert("Reading", sbuf.toString(),null, AlertType.WARNING);
        alert.setTimeout(Alert.FOREVER);
        display.setCurrent(alert);
        }
        }
        catch (Exception error)
        {
        alert = new Alert("Error Reading",error.toString(), null, AlertType.WARNING);
        alert.setTimeout(Alert.FOREVER);
        display.setCurrent(alert);
        }
        try
        {
        recordstore.closeRecordStore();
        }
        catch (Exception error)
        {
        alert = new Alert("Error Closing",error.toString(), null, AlertType.WARNING);
        alert.setTimeout(Alert.FOREVER);
        display.setCurrent(alert);
        }
        if (RecordStore.listRecordStores() != null)
        {
        try
        {
        RecordStore.deleteRecordStore("myRecordStore");
        recordEnumeration.destroy();
        filter.filterClose();
        }
        catch (Exception error)
        {
        alert = new Alert("Error Removing",error.toString(), null, AlertType.WARNING);
        alert.setTimeout(Alert.FOREVER);
        display.setCurrent(alert);
        }
        }

        }
        }
        }
        class Filter implements RecordFilter
        {
        private String search = null;
        private ByteArrayInputStream inputstream = null;
        private DataInputStream datainputstream = null;
        public Filter(String search)
        {
        this.search = search.toLowerCase();
        }
        public boolean matches(byte[] suspect)
        {
        String string = new String(suspect).toLowerCase();

        if (string!= null && string.indexOf(search) != -1)
            return true;
        else
            return false;
        }

        public void filterClose()
        {
        try
        {
        if (inputstream != null)
        {
        inputstream.close();
        }
        if (datainputstream != null)
        {
        datainputstream.close();
        }
        }
        catch ( Exception error)
        {
        }
        }
        }
Run Code Online (Sandbox Code Playgroud)

gna*_*nat 5

您的代码段很大,格式很糟糕,因此可能还有其他一些我没有注意到的错误,但是如果您担心的是在此行创建的遍历枚举的顺序:

recordEnumeration = recordstore.enumerateRecords(filter, null, false);
Run Code Online (Sandbox Code Playgroud)

这是正常现象。MIDP RMS API文档指出,当第二个参数是null(而且在你的代码),然后记录在未定义的顺序遍历。

请参阅下面的报价,并注意与以下内容有关的详细信息 RecordComparator comparator

recordEnumeration = recordstore.enumerateRecords(filter, null, false);
Run Code Online (Sandbox Code Playgroud)

您可能会想到它,因为Netbeans模拟器每次运行Midlet时都以相同的方式遍历记录,这只是一个幸运的巧合。从理论上讲,每次运行都可以更改顺序。