java - ArrayIndexOutOfBoundsException - Can't find the error in my method -


i'm trying figure out made mistakes in code can't out of it.

i'm writing simple hangman game code. seems work until wrong letter typed in jtextarea. error appears located in "gioca()" method.

here's code:

package giocoimpiccato;  //frame in cui si visualizza il gioco. qui c'è il metodo main.  import java.util.arraylist; import java.util.random; import javax.swing.imageicon;  //composto da 1 jlabel per la foto, 1 jlabel per il titolo, 1 jlabel per il  risultato, 1 jlabel per le lettere inserite, 1 jlabel per la parola e 1  jtextarea per inserire le lettere public class giocoimpiccatoframe extends javax.swing.jframe  { public string paroladaindovinare; public arraylist<string> lettereusate; //uso un vettore perchè ha grandezza variabile public int tentativi = 6; public arraylist<integer> letteretrovate; public int sfondocount = 0; public imageicon[] sfondi; //uso un array perchè ha grandezza fissa public int sfondousato = 0; public string lettusate = "";  //costruttore public giocoimpiccatoframe()  {     letteretrovate = new arraylist<integer>();     lettereusate = new arraylist<string>();     paroladaindovinare = leggiparola();     sfondi =  new imageicon[sfondocount + 1];     for(int i=0; i<sfondocount; i++)     {         imageicon file = new javax.swing.imageicon(getclass().getresource("/albero" + + ".jpg"));         sfondi[i] = file;     }      initcomponents();     setlocationrelativeto(null); //per far apparire il frame in centro allo schermo      labelsfondo.seticon(sfondi[0]); }  //metodo che estrae casualmente una parola dall'array public string leggiparola() {     random r = new random();     int idx = 0;     string parola = "";      string[] parole = new string[10];     parole[0] = "cane";     parole[1] = "gatto";     parole[2] = "pescespada";     parole[3] = "frutta";     parole[4] = "videogioco";     parole[5] = "sentinella";     parole[6] = "oviparo";     parole[7] = "ateneo";     parole[8] = "poltrona";     parole[9] = "fucina";      idx = r.nextint(parole.length - 1);     parola = parole[idx];      return parola; }  //controlla le lettere inserite, le confronta con quelle della parola e le inserisce (tramite metodo visualizzazioneparola) e segna gli errori public void gioca(string c) {     boolean fine = false;     boolean nonusato = true;     boolean trovato = false;      if (c.length() == 1)     {         (string lettusata : lettereusate) //ciclo che percorre tutto un array e assegna alla variabile lettusata ogni volta un valore dell'array fino farli tutti         {             if ((c.touppercase()).equals(lettusata.touppercase())) // equals per le stringhe - touppercase trasforma tutto in maiuscole per il confronto             {                 nonusato = false;                 break;             }         }          if (nonusato)         {             lettereusate.add(c);             lettusate = lettusate + " " + c;             trovato = cerca(c.charat(0));             if (trovato)             {                 labelparola.settext(visualizzazioneparola());                 fine = haivinto();             }             else             {                 tentativi--;                 labelsfondo.seticon(sfondi[++sfondousato]);             }         }     } }  //metodo che restituisce una variabile booleana dopo aver confrontato il carattere in ingresso con quelli della parola da indovinare public boolean cerca(char c) {     boolean trovato = false;      (int = 0; < paroladaindovinare.length(); i++)     {         if (character.tolowercase(paroladaindovinare.charat(i)) == character.tolowercase(c))         {             letteretrovate.add(i);             trovato = true;         }     }      return trovato; }  //metodo che restituisce una variabile booleana per la vittoria public boolean haivinto() {     if (paroladaindovinare.length() == letteretrovate.size())     {         labelparola.settext(visualizzazioneparola());         labelrisultato.settext("hai vinto!");         txtinput.setenabled(false);         return true;     }     else     {         return false;     } }  // inserisce le lettere alla posizione corretta o la lineetta in caso di lettera ancora da indovinare public string visualizzazioneparola() {     string str = "";     boolean trovato = false;      (int = 0; < paroladaindovinare.length(); i++)     {         trovato = false;          (int j : letteretrovate)         {             if (j == i)             {                 str = str + paroladaindovinare.charat(i);                 trovato = true;                 break;             }         }          if (trovato == false)         {             str = str + "_";         }          if (i != paroladaindovinare.length()-1)         {             str = str + " ";         }     }      return str; }  /**  * method called within constructor initialize form.  * warning: not modify code. content of method  * regenerated form editor.  */ @suppresswarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="generated code">                           private void initcomponents() {      labeltitolo = new javax.swing.jlabel();     labellettere = new javax.swing.jlabel();     labelparola = new javax.swing.jlabel();     labelrisultato = new javax.swing.jlabel();     txtinput = new javax.swing.jtextfield();     labelsfondo = new javax.swing.jlabel();      setdefaultcloseoperation(javax.swing.windowconstants.exit_on_close);     settitle("il gioco dell'impiccato");     setminimumsize(new java.awt.dimension(1000, 600));     setsize(new java.awt.dimension(1000, 600));     getcontentpane().setlayout(null);      labeltitolo.setfont(new java.awt.font("copperplate gothic light", 1, 36)); // noi18n     labeltitolo.setforeground(new java.awt.color(255, 0, 0));     labeltitolo.sethorizontalalignment(javax.swing.swingconstants.center);     labeltitolo.settext("il gioco dell'impiccato");     getcontentpane().add(labeltitolo);     labeltitolo.setbounds(156, 6, 662, 94);      labellettere.setfont(new java.awt.font("arial", 1, 24)); // noi18n     labellettere.setforeground(new java.awt.color(255, 0, 0));     labellettere.settext(lettusate);     getcontentpane().add(labellettere);     labellettere.setbounds(6, 146, 470, 64);      labelparola.setfont(new java.awt.font("copperplate gothic light", 1, 36)); // noi18n     labelparola.setforeground(new java.awt.color(255, 0, 0));     labelparola.sethorizontalalignment(javax.swing.swingconstants.center);     labellettere.settext(visualizzazioneparola());      labellettere.settooltiptext(paroladaindovinare);     getcontentpane().add(labelparola);     labelparola.setbounds(6, 410, 651, 78);      labelrisultato.setfont(new java.awt.font("copperplate gothic light", 1, 36)); // noi18n     labelrisultato.setforeground(new java.awt.color(255, 0, 0));     labelrisultato.sethorizontalalignment(javax.swing.swingconstants.center);     getcontentpane().add(labelrisultato);     labelrisultato.setbounds(6, 506, 812, 88);      txtinput.setfont(new java.awt.font("arial", 1, 24)); // noi18n     txtinput.setforeground(new java.awt.color(255, 0, 0));     txtinput.sethorizontalalignment(javax.swing.jtextfield.center);     txtinput.addactionlistener(new java.awt.event.actionlistener() {         public void actionperformed(java.awt.event.actionevent evt) {             txtinputactionperformed(evt);         }     });     getcontentpane().add(txtinput);     txtinput.setbounds(6, 262, 142, 91);      labelsfondo.sethorizontalalignment(javax.swing.swingconstants.center);     getcontentpane().add(labelsfondo);     labelsfondo.setbounds(0, 0, 1000, 600);      pack(); }// </editor-fold>                          private void txtinputactionperformed(java.awt.event.actionevent evt) {                                              // todo add handling code here:     gioca(txtinput.gettext());      if(tentativi==0)     {         labelrisultato.settext("hai perso: la parola era '" + paroladaindovinare.touppercase() + "'");         txtinput.setenabled(false);     }      txtinput.settext("");     labellettere.settext(lettusate); }                                          /**  * @param args command line arguments  */ public static void main(string args[]) {     /* set nimbus , feel */     //<editor-fold defaultstate="collapsed" desc=" , feel setting code (optional) ">     /* if nimbus (introduced in java se 6) not available, stay default , feel.      * details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html       */     try {         (javax.swing.uimanager.lookandfeelinfo info : javax.swing.uimanager.getinstalledlookandfeels()) {             if ("nimbus".equals(info.getname())) {                 javax.swing.uimanager.setlookandfeel(info.getclassname());                 break;             }         }     } catch (classnotfoundexception ex) {         java.util.logging.logger.getlogger(giocoimpiccatoframe.class.getname()).log(java.util.logging.level.severe, null, ex);     } catch (instantiationexception ex) {         java.util.logging.logger.getlogger(giocoimpiccatoframe.class.getname()).log(java.util.logging.level.severe, null, ex);     } catch (illegalaccessexception ex) {         java.util.logging.logger.getlogger(giocoimpiccatoframe.class.getname()).log(java.util.logging.level.severe, null, ex);     } catch (javax.swing.unsupportedlookandfeelexception ex) {         java.util.logging.logger.getlogger(giocoimpiccatoframe.class.getname()).log(java.util.logging.level.severe, null, ex);     }     //</editor-fold>      /* create , display form */     java.awt.eventqueue.invokelater(new runnable() {         public void run() {             new giocoimpiccatoframe().setvisible(true);         }     }); }  // variables declaration - not modify                      private javax.swing.jlabel labellettere; private javax.swing.jlabel labelparola; private javax.swing.jlabel labelrisultato; private javax.swing.jlabel labelsfondo; private javax.swing.jlabel labeltitolo; private javax.swing.jtextfield txtinput; // end of variables declaration                    } 

and here's exception generates when type wrong letter:

exception in thread "awt-eventqueue-0" java.lang.arrayindexoutofboundsexception: 1 @ giocoimpiccato.giocoimpiccatoframe.gioca(giocoimpiccatoframe.java:97) @ giocoimpiccato.giocoimpiccatoframe.txtinputactionperformed(giocoimpiccatoframe.java:240) 

it's wrong letter can't added arraylist lettereusate.

i'd appreciate tip. thank you!

here's line 97:

labelsfondo.seticon(sfondi[++sfondousato]); 

you creating sfondi array this:

sfondi = new imageicon[sfondocount + 1]; 

sfondocount set 0 , never changed, sfondi 1 element array (so valid index sfondi[0]). later, this:

labelsfondo.seticon(sfondi[++sfondousato]); 

before statement executed, sfondousato 0 because using prefix increment, incremented before value used, end with:

labelsfondo.seticon(sfondi[1]); 

and we've determined sfondi[0] valid index.


Comments

Popular posts from this blog

ios - MKAnnotationView layer is not of expected type: MKLayer -

ZeroMQ on Windows, with Qt Creator -

unity3d - Unity SceneManager.LoadScene quits application -