ezz


  ezz > edb.programmering.* > edb.programmering.java

 #1  
30.09.2011, 07:07
Thomas Jensen
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  
30.09.2011, 07:30
Thomas Jensen
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  
30.09.2011, 07:33
Thomas Jensen
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  
01.10.2011, 00:08
Arne Vajhøj
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  
01.10.2011, 12:59
Thomas Jensen
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