Salve a tutti, volevo chiedere aiuto per un programma che sto realizzando in j2me. Il problema che mi si pone davanti è il seguente. Quando apro la midlet da me creata(ovvero nel momento in cui la midlet cerca di leggere dati, se possibile, dal record store) e quando tento di salvare i dati da me inseriti nel record store, viene generata un'eccezione che riesco a comprendere, ma che non capisco come risolvere.
MIDlet:
Classe utilizzata dalla MIDlet:codice:/* * Coded by ScemoScemo * MyMoney - Gestione monete * MIDlet il cui fine è facilitare la gestione delle monete in mio possesso. * Consente di gestire tre tipi di monete: * - 2 euro * - 1 euro * - 0,50 euro */ import javax.microedition.midlet.*; import javax.microedition.lcdui.*; import java.util.Date; public class MoneyMidlet extends MIDlet implements CommandListener { // Componenti Grafici private Display display; private Form formPrincipale; private Command cmdExit; private Command cmdSave; private StringItem strDataInizio; private StringItem credits; private TextField txtMoneteDa2; private TextField txtMoneteDa1; private TextField txtMoneteDa50; // Componenti per i dati private Money monete; public MoneyMidlet() { display = Display.getDisplay(this); // Istanzio i vari oggetti del form formPrincipale = new Form("MyMoney - Gestione Monete"); cmdExit = new Command("Esci", Command.EXIT, 1); cmdSave = new Command("Salva", Command.OK, 2); txtMoneteDa2 = new TextField("Monete Da 2:", null, 5, TextField.NUMERIC); txtMoneteDa1 = new TextField("Monete Da 1:", null, 5, TextField.NUMERIC); txtMoneteDa50 = new TextField("Monete Da 50:", null, 5, TextField.NUMERIC); strDataInizio = new StringItem("Data Inizio Raccolta: ", ""); credits = new StringItem("Autore del Programma:", "ScemoScemo"); // Istanzio l'oggetto per la gestione dei dati monete = new Money(); // Se è la prima volta che viene avviata la midlet setto tutto a 0 if (monete.isFirstTime()) { strDataInizio.setText(new Date().toString()); txtMoneteDa2.setString("0"); txtMoneteDa1.setString("0"); txtMoneteDa50.setString("0"); } else { loadFromRS(); } } public void loadFromRS() { strDataInizio.setText(monete.getDataInizioRaccolta()); txtMoneteDa2.setString(Integer.toString(monete.getMoneteDa2())); txtMoneteDa1.setString(Integer.toString(monete.getMoneteDa1())); txtMoneteDa50.setString(Integer.toString(monete.getMoneteDa50())); } protected void startApp() throws MIDletStateChangeException { // Aggiungo al form i vari componenti formPrincipale.append(credits); formPrincipale.append(strDataInizio); formPrincipale.append(txtMoneteDa2); formPrincipale.append(txtMoneteDa1); formPrincipale.append(txtMoneteDa50); formPrincipale.addCommand(cmdExit); formPrincipale.addCommand(cmdSave); formPrincipale.setCommandListener(this); // Setto formPrincipale sul display display.setCurrent(formPrincipale); } protected void pauseApp() { notifyPaused(); } protected void destroyApp(boolean arg0) throws MIDletStateChangeException {} public void commandAction(Command c, Displayable arg1) { if (c == cmdExit) { notifyDestroyed(); } else if (c == cmdSave) { monete.setDataInizioRaccolta(strDataInizio.getText()); monete.setMoneteDa2(Integer.parseInt(txtMoneteDa2.getString())); monete.setMoneteDa1(Integer.parseInt(txtMoneteDa1.getString())); monete.setMoneteDa50(Integer.parseInt(txtMoneteDa50.getString())); monete.saveToRS(); } } }
Eccezioni Generate:codice:/* * Coded by ScemoScemo * MyMoney - Gestione monete * MIDlet il cui fine è facilitare la gestione delle monete in mio possesso. * Consente di gestire tre tipi di monete: * - 2 euro * - 1 euro * - 0,50 euro */ import javax.microedition.rms.*; public class Money { private RecordStore dataBase = null; final static private String DBNAME = "mymoney_db"; private int nMonete2; private int nMonete1; private int nMonete50; private String dataInizioRaccolta; private boolean firstTime; public Money() { byte buff[] = null; firstTime = true; openRS(); // Leggo la quantità di monete e la data di inzio della raccolta try { if (dataBase.getNumRecords() > 0) { try { dataBase.getRecord(0, buff, 0); dataInizioRaccolta = new String(buff); dataBase.getRecord(1, buff, 0); nMonete2 = Integer.parseInt(new String(buff)); dataBase.getRecord(2, buff, 0); nMonete1 = Integer.parseInt(new String(buff)); dataBase.getRecord(3, buff, 0); nMonete50 = Integer.parseInt((new String(buff))); //closeRS(); } catch (RecordStoreNotOpenException e) { e.printStackTrace(); } catch (InvalidRecordIDException e) { e.printStackTrace(); } catch (RecordStoreException e) { e.printStackTrace(); } firstTime = false; } } catch (RecordStoreNotOpenException e) { e.printStackTrace(); } } // Metodi GETTER public int getMoneteDa2() { return nMonete2; } public int getMoneteDa1() { return nMonete1; } public int getMoneteDa50() { return nMonete50; } public String getDataInizioRaccolta() { return dataInizioRaccolta; } /** * @return true se è la prima volta che viene avviata la midlet, false altrimenti */ public boolean isFirstTime() { return firstTime; } // Metodi SETTER public void setDataInizioRaccolta(String dataInizioRaccolta) { this.dataInizioRaccolta = dataInizioRaccolta; } public void setMoneteDa2(int moneteDa2) { nMonete2 = moneteDa2; } public void setMoneteDa1(int moneteDa1) { nMonete1 = moneteDa1; } public void setMoneteDa50(int moneteDa50) { nMonete50 = moneteDa50; } public void saveToRS() { byte[] buff; /* Se non è aperto lo apro, altrimento lo elimino e lo ricreo */ if (RecordStore.listRecordStores() == null) { openRS(); } else { closeAndDeleteRS(); openRS(); } // Tento di scrivere nel record store try { buff = dataInizioRaccolta.getBytes(); dataBase.addRecord(buff, 0, buff.length); buff = (Integer.toString(nMonete2)).getBytes(); dataBase.addRecord(buff, 0, buff.length); buff = (Integer.toString(nMonete1)).getBytes(); dataBase.addRecord(buff, 0, buff.length); buff = (Integer.toString(nMonete50)).getBytes(); dataBase.addRecord(buff, 0, buff.length); closeRS(); } catch (InvalidRecordIDException e) { e.printStackTrace(); } catch (RecordStoreNotOpenException e) { e.printStackTrace(); } catch (RecordStoreFullException e) { e.printStackTrace(); } catch (RecordStoreException e) { e.printStackTrace(); } } private void openRS() { // Tento di aprire il record store try { dataBase = RecordStore.openRecordStore(DBNAME, true); } catch (RecordStoreException rse) { rse.printStackTrace(); } } private void closeRS() { // Tento di chiudere il RecordStore try { dataBase.closeRecordStore(); } catch (RecordStoreException e) { e.printStackTrace(); } } private void closeAndDeleteRS() { // Tento di chiudere ed eliminare il RecordStore try { dataBase.closeRecordStore(); RecordStore.deleteRecordStore(DBNAME); } catch (RecordStoreException e) { e.printStackTrace(); } } }
codice:Questa mi indica che l'id passatogli non è valido, però io specifico che se il record store è vuoto non devo accederglil. javax.microedition.rms.InvalidRecordIDException at javax.microedition.rms.RecordStore.findRecord(+98) at javax.microedition.rms.RecordStore.getRecord(+18) at Money.<init>(+40) at MoneyMidlet.<init>(+142) at java.lang.Class.runCustomCode(+0) at com.sun.midp.midlet.MIDletState.createMIDlet(+34) at com.sun.midp.midlet.Selector.run(+22)codice:Questa mi indica che non c'è un riferimento giusto per un oggetto da quanto ho capito. java.lang.NullPointerException at Money.saveToRS(+33) at MoneyMidlet.commandAction(+95) at javax.microedition.lcdui.Display$DisplayAccessor.commandAction(+282) at javax.microedition.lcdui.Display$DisplayManagerImpl.commandAction(+10) at com.sun.midp.lcdui.DefaultEventHandler.commandEvent(+68) at com.sun.midp.lcdui.AutomatedEventHandler.commandEvent(+47) at com.sun.midp.lcdui.DefaultEventHandler$QueuedEventHandler.handleVmEvent(+186) at com.sun.midp.lcdui.DefaultEventHandler$QueuedEventHandler.run(+57)

Rispondi quotando