|
|
||||||
|
#1
|
|
|
|
|
Jeg har lavet et j2me-program til min telefon, og fik nogle problemer da
jeg ville ændre sk?iftstørrelsen. Efter at have rodet med det et stykke tid, finder jeg ud af - kort fortalt - at hvis jeg har en liste med 4 elementer, og ændrer fontstørrelsen på dem, og derefter tlføjer et 5. element, så opstår der er en ArrayIndexOutOfBoundsException. Hvis jeg ikke ændrer fontstørrelsen, så er der ingen problemer i at tilføje flere elementer til listen. Jeg har inkluderet et lille program der demonstrerer problemet, længere nede i teksten. Vær opmærksom på, at det er j2me kode. setFont er en metode til List - se [url down] List.html Nu er jeg jo bare en amatør, med et meget begrænset kendskab til java, men jeg synes det ligner en bug. Gør jeg noget indlysende forkert? Er der nogen der har et forslag til hvordan jeg kan løse problemet? Hvis jeg kører test-programmet i Netbeans6.9 med WTK2.5.2 og JDK1.6.0.26 under Linux, får jeg følgende output: java.lang.ArrayIndexOutOfBoundsException at javax.microedition.lcdui.ChoiceGroup.insertImpl(Ch oiceGroup.java:1420) at javax.microedition.lcdui.ChoiceGroup.append(Choice Group.java:397) at javax.microedition.lcdui.List.append(List.java:429 ) at listtest.commandAction(listtest.java:70) at javax.microedition.lcdui.Display$DisplayAccessor.c ommandAction (Display.java:2093) at javax.microedition.lcdui.Display$DisplayManagerImp l.commandAction (Display.java:2929) at com.sun.midp.lcdui.DefaultEventHandler.commandEven t (DefaultEventHandler.java:297) at com.sun.midp.lcdui.AutomatedEventHandler.commandEv ent (AutomatedEventHandler.java:667) at com.sun.midp.lcdui.DefaultEventHandler$QueuedEvent Handler.handleVmEvent (DefaultEventHandler.java:711) at com.sun.midp.lcdui.DefaultEventHandler$QueuedEvent Handler.run (DefaultEventHandler.java:608) Hvis jeg bygger og kører med ktoolbar i WTK2.5.2, får jeg: java.lang.ArrayIndexOutOfBoundsException at javax.microedition.lcdui.ChoiceGroup.insertImpl(+4 56) at javax.microedition.lcdui.ChoiceGroup.append(+25) at javax.microedition.lcdui.List.append(+9) at listtest.commandAction(+71) at javax.microedition.lcdui.Display$DisplayAccessor.c ommandAction(+282) at javax.microedition.lcdui.Display$DisplayManagerImp l.commandAction(+10) at com.sun.midp.lcdui.DefaultEventHandler.commandEven t(+68) at com.sun.midp.lcdui.AutomatedEventHandler.commandEv ent(+47) at com.sun.midp.lcdui.DefaultEventHandler$QueuedEvent Handler.handleVmEvent (+186) at com.sun.midp.lcdui.DefaultEventHandler$QueuedEvent Handler.run(+57) Altså cirka det samme. Når jeg kører programmet på min Samsung B2100 telefon får jeg ingen errors, men den nye linie (list.append("test", null)) bliver ikke tilføjet, og de efterfølgende list.setFont(i, f) bliver ikke udført. Okay, gode råd modtages... ;-) -- CODE START -- import java.util.*; import javax.microedition.lcdui.*; import javax.microedition.midlet.*; public class listtest extends MIDlet implements CommandListener { private Display display; private List list; private Command exitcmd, reloadcmd; private Vector v; Font f; public void startApp() { reloadcmd = new Command("Reload", Command.SCREEN, 1); exitcmd = new Command("Exit", Command.EXIT, 2); f = Font.getFont(0, 0, Font.SIZE_LARGE); v = new Vector(1,1); v.addElement("string1"); v.addElement("string2"); v.addElement("string3"); v.addElement("string4"); list = new List("", Choice.IMPLICIT); list.addCommand(reloadcmd); list.addCommand(exitcmd); list.setCommandListener(this); int i = 0; for (Enumeration e = v.elements(); e.hasMoreElements(); i++ ) { list.append((String)e.nextElement(), null); // ArrayIndexOutOfBoundsException, if setting font here... // list.setFont(i, f); } for (i=1 ; i<list.size() ; i++ ) { // not on first element // It's okay here list.setFont(i, f); } display = Display.getDisplay(this); display.setCurrent(list); } public void pauseApp() { } public void destroyApp(boolean unconditional) { } public void commandAction (Command c, Displayable d) { if (c == reloadcmd) { // list.deleteAll(); // for (Enumeration e = v.elements(); e.hasMoreElements(); ) { // list.append((String)e.nextElement(), null); // } list.append("test", null); // for (i=0 ; i<list.size() ; i++ ) { // if (!list.getFont(i).equals(f)) { // list.setFont(i, f); // } // } display.setCurrent(list); } if (c == exitcmd) { destroyApp(true); notifyDestroyed(); } } } -- CODE END -- |
|
|
|
#2
|
|
|
|
|
On Fri, 30 Sep 2011 07:07:41 +0000, Thomas Jensen wrote:
Jeg ved ikke hvad der går galt med de her linieskift - prøver lige igen Hvis jeg kører test-programmet i Netbeans6.9 med WTK2.5.2 og JDK1.6.0.26 under Linux, får jeg følgende output: java.lang.ArrayIndexOutOfBoundsException at javax.microedition.lcdui.ChoiceGroup.insertImpl(Ch oiceGroup.java:1420) at javax.microedition.lcdui.ChoiceGroup.append(Choice Group.java:397) at javax.microedition.lcdui.List.append(List.java:429 ) at listtest.commandAction(listtest.java:70) at javax.microedition.lcdui.Display$DisplayAccessor.c ommandAction (Display.java:2093) at javax.microedition.lcdui.Display$DisplayManagerImp l.commandAction (Display.java:2929) at com.sun.midp.lcdui.DefaultEventHandler.commandEven t (DefaultEventHandler.java:297) at com.sun.midp.lcdui.AutomatedEventHandler.commandEv ent (AutomatedEventHandler.java:667) at com.sun.midp.lcdui.DefaultEventHandler$QueuedEvent Handler.handleVmEvent (DefaultEventHandler.java:711) at com.sun.midp.lcdui.DefaultEventHandler$QueuedEvent Handler.run (DefaultEventHandler.java:608) Hvis jeg bygger og kører med ktoolbar i WTK2.5.2, får jeg: java.lang.ArrayIndexOutOfBoundsException at javax.microedition.lcdui.ChoiceGroup.insertImpl(+4 56) at javax.microedition.lcdui.ChoiceGroup.append(+25) at javax.microedition.lcdui.List.append(+9) at listtest.commandAction(+71) at javax.microedition.lcdui.Display$DisplayAccessor.c ommandAction(+282) at javax.microedition.lcdui.Display$DisplayManagerImp l.commandAction(+10) at com.sun.midp.lcdui.DefaultEventHandler.commandEven t(+68) at com.sun.midp.lcdui.AutomatedEventHandler.commandEv ent(+47) at com.sun.midp.lcdui.DefaultEventHandler$QueuedEvent Handler.handleVmEvent (+186) at com.sun.midp.lcdui.DefaultEventHandler$QueuedEvent Handler.run(+57) -- CODE START -- import java.util.*; import javax.microedition.lcdui.*; import javax.microedition.midlet.*; public class listtest extends MIDlet implements CommandListener { private Display display; private List list; private Command exitcmd, reloadcmd; private Vector v; Font f; public void startApp() { reloadcmd = new Command("Reload", Command.SCREEN, 1); exitcmd = new Command("Exit", Command.EXIT, 2); f = Font.getFont(0, 0, Font.SIZE_LARGE); v = new Vector(1,1); v.addElement("string1"); v.addElement("string2"); v.addElement("string3"); v.addElement("string4"); list = new List("", Choice.IMPLICIT); list.addCommand(reloadcmd); list.addCommand(exitcmd); list.setCommandListener(this); int i = 0; for (Enumeration e = v.elements(); e.hasMoreElements(); i++ ) { list.append((String)e.nextElement(), null); // ArrayIndexOutOfBoundsException, if setting font here... // list.setFont(i, f); } for (i=1 ; i<list.size() ; i++ ) { // not on first element // It's okay here list.setFont(i, f); } display = Display.getDisplay(this); display.setCurrent(list); } public void pauseApp() { } public void destroyApp(boolean unconditional) { } public void commandAction (Command c, Displayable d) { if (c == reloadcmd) { // list.deleteAll(); // for (Enumeration e = v.elements(); e.hasMoreElements(); ) { // list.append((String)e.nextElement(), null); // } list.append("test", null); // for (i=0 ; i<list.size() ; i++ ) { // if (!list.getFont(i).equals(f)) { // list.setFont(i, f); // } // } display.setCurrent(list); } if (c == exitcmd) { destroyApp(true); notifyDestroyed(); } } } -- CODE END -- |
|
#3
|
|
|
|
|
On Fri, 30 Sep 2011 07:30:40 +0000, Thomas Jensen wrote:
> On Fri, 30 Sep 2011 07:07:41 +0000, Thomas Jensen wrote: > > Jeg ved ikke hvad der går galt med de her linieskift - prøver lige igen > Nå. Det plejer da ikke at være et problem... Det beklager jeg. |
|
#4
|
|
|
|
|
On 9/30/2011 3:30 AM, Thomas Jensen wrote:
> Hvis jeg kører test-programmet i Netbeans6.9 med WTK2.5.2 og JDK1.6.0.26 > under Linux, får jeg følgende output: > > java.lang.ArrayIndexOutOfBoundsException > at javax.microedition.lcdui.ChoiceGroup.insertImpl(Ch oiceGroup.java:1420) > Hvis jeg bygger og kører med ktoolbar i WTK2.5.2, får jeg: > > java.lang.ArrayIndexOutOfBoundsException > at javax.microedition.lcdui.ChoiceGroup.insertImpl(+4 56) [..] > for (Enumeration e = v.elements(); e.hasMoreElements(); i++ ) { > list.append((String)e.nextElement(), null); > // ArrayIndexOutOfBoundsException, if setting font here... > // list.setFont(i, f); > } > > for (i=1 ; i<list.size() ; i++ ) { // not on first element > // It's okay here > list.setFont(i, f); > } Nu kender jeg intet til ME, så jeg kan sagtens over se noget, men umiddlbart virker det mystisk. Kan du finde ud af hvilken værdi af i der giver exception of hvad list.size() er når det sker? Arne |
|
#5
|
|
|
|
|
On Fri, 30 Sep 2011 20:08:57 -0400, Arne Vajhøj wrote:
> Kan du finde ud af hvilken værdi af i der giver exception of hvad > list.size() er når det sker? > Ja, jeg ved godt det forvirrer lidt med de der loops og 'i' der bliver sat til 1 osv. Men det er ikke her problemet er. Jeg er lige blevet lidt klogere. Det viser sig, at når en liste oprettes, så allokeres der plads til 4 elementer (et array). Hvis et 5. element tilføjes (list.append()), så allokeres der plads til 4 nye elementer. numOfEls er nu 5, men der er allokeret plads til 8 elementer. At det foregår i spring af 4 er ikke det vigtige i denne sammenhæng, men derimod at numOfEls indeholder det reelle antal elementer i listen. Så det er ikke her problemet er. I debuggeren bliver 'fontEls' ikke sat, før første kald til setFont(). fontEls er et array af Font-objekter i List, og størrelsen af det array bliver sat til det aktuelle antal elementer i listen - på det tidspunkt hvor første kald til setFont() foretages. int i = 0; for (Enumeration e = v.elements(); e.hasMoreElements(); i++ ) { list.append((String)e.nextElement(), null); // ArrayIndexOutOfBoundsException, if setting font here... //list.setFont(i, f); } Dvs, hvis jeg fjerner kommentaren, så numOfEls 1 efter første gennemløb, og fontEls indeholder et font-oject. Når andet gennemløb begynder, vil list.append(), af uvisse årsager, udløse en exception. Hvis list.setFont () ikke køres i ovenstående loop, så vil numOfEls være 4 (list.size()) når vi når til næste loop: for (i=0 ; i<list.size() ; i++ ) { // It's okay here list.setFont(i, f); } og der er ingen problemer, før vi bruger list.append() igen. Det kan undre at list.append() smider en exception. Jeg kunne forstå det, hvis det var fontEls der ikke blev opdateret, og derfor smed en exception når man prøvede at skrive til et index der ikke fandtes. Men det er list.append() der udløser en exception. En List er: public class List extends Screen implements Choice Om Choice står der: "Each element of a Choice is composed of a text string part, an Image part, and a font attribute that are all treated as a unit. " Jeg synes nu ikke det ligner "a unit". fontEls bliver ikke allokeret før man bruger setFont() første gang, og er ikke en del af et element, men en del af en listen. "When a new element is inserted or appended, the implementation provides a default font for the font attribute. This default font is the same font that is used if the application calls setFont(i, null). " Men så langt når man ikke, for fontEls når ikke at blive opdateret med oplysningen om at listen er blevet udviddet. Jeg tror løsningen bliver at slette listen, og så oprette en ny, hver gang jeg har behov for at tilføje nye elementer til listen. Det lyder grimt, men i praksis tager det et splitsekund, så det er nok det bedste. |
|
|
| Lignende emner | |
| AGK internetradio - station list ? (well list) ? Jeg har netop købt en AGK internetradio ([..] index.php?side_id=336) Desværre var jeg ikke opmærksom på at man ikke bare kan indtaste en URL, men at den henter streams fra... |
|
| Baggrundsbillede list item i unordered list Hejsa Hvordan kan jeg sætte et baggrundsbillede på et list item i unordered list? Jeg havde forestillet mig noget á la nedenstående, men det virker ikke da background-image... |
|
| 'list-style-type' på 'definition list' Er det muligt at benytte 'list-style-type' på en 'definition list'. Har uden held prøvet at få det til at virke. Ikke muligt - eller hvad? //smith |
|
| J2ME? Jeg programmerer dagligt i det almindelige J2SE, og har nu fået nallerne i en af de smarte telefoner der har Java support :-) De kører jo J2ME, men synes jeg har lidt... |
|
|
Al tidssætning er GMT. Klokken er nu 00:32. | Privacy Policy
|