Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it L'avatar di burm87
    Registrato dal
    Aug 2009
    Messaggi
    30

    [JAVA] Problema con eccezione indexoutofbounds

    Ciao a tutti, sono nuovo qui e particolarmente impedito con la programmazione XD Cmq sto finendo un piccolo progetto per un esame nel quale ho sviluppato una semplice interfaccia per la gestione di una rubrica che salva in una list degli oggetti di una mia classe che contiene 5 campi corrispondenti ai 5 campi che l'utente deve compilare. Il programma prevede poi la gestione dei file e quindi salva su .txt i record registrati e poi deve, anzi dovrebbe, caricare nella lista i record presenti su file .txt creato precedentemente sempre dall'applicazione. Il problema è proprio qui, xke qnd lancio il caricamento da file mi lancia una lista infinita di eccezioni e non ho proprio idea di come prenderle. Qualcuno riesce a darmi un mano per finire il progetto? Non posto tutto il codice che ho scritto finora xke è piuttosto lunghetto.
    Grazie a tutti in anticipo!

  2. #2
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802

    Re: [JAVA] Problema con eccezione indexoutofbounds

    Originariamente inviato da burm87
    Non posto tutto il codice che ho scritto finora xke è piuttosto lunghetto.
    Grazie a tutti in anticipo!
    Posta almeno quella parte che da problemi, altrimenti come facciamo ad aiutarti?
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  3. #3
    Utente di HTML.it L'avatar di burm87
    Registrato dal
    Aug 2009
    Messaggi
    30

    Re: Re: [JAVA] Problema con eccezione indexoutofbounds

    Originariamente inviato da Alex'87
    Posta almeno quella parte che da problemi, altrimenti come facciamo ad aiutarti?
    Si posso anche postarla ma dopo chiamo altre funzioni sparse per tutta la classe quindi postare un pezzo non avrebbe senso Non so posso anche inviare il .java se qualcuno ha voglia di darmi una mano tanto sicuro per qualcuno che ci sa fare sarà una cosa banale! In caso posso anche postare tutto quanto per me non ci sono problemi!

  4. #4
    Utente di HTML.it L'avatar di burm87
    Registrato dal
    Aug 2009
    Messaggi
    30
    In pratica i file salvati vengono creati come segue:

    Stringa di riconoscimento (per verificare al caricamento che sia un file valido)
    \n
    \n
    Cognome Nome
    Telefono
    Indirizzo
    Città
    \n
    record successivo

    I valori dei JTextField vengono salvati in oggetti di tipo MiaClasse e poi questi oggetti MiaClasse vengono inseriti in una ArrayList con list.add o list.set. Per il salvataggio del file non ho avuto problemi infatti il .txt viene creato correttamente, poi per il caricamento faccio leggere la prima stringa e se questa è uguale alla stringa di riconoscimento il file viene considerato valido altrimenti no e viene mostrato un messaggio e anke questo funziona; poi però qnd si tratta di leggere le stringhe successive(per reinserire i vari record nella lista e poterne aggiungere degli altri), dividere con la split() la stringa Cognome Nome succede il putiferio. Questo è il metodo che ho scritto per caricare i valori nella lista:

    codice:
    public static void carica(){
    		
    		chooseopen = new JFileChooser();
    		//chooseopen.addChoosableFileFilter(new MyFilter());
    		int n = chooseopen.showOpenDialog(frame);
    		if(n == JFileChooser.APPROVE_OPTION)
    			try {
    				openfile(chooseopen.getSelectedFile());
    			} catch (IOException e) {
    				JOptionPane.showMessageDialog(frame, "Errore durante il caricamento del file.", "Errore", JOptionPane.ERROR_MESSAGE, new ImageIcon(Rubrica.class.getResource("warn.png")));
    			}
    		
    	}//carica
    Questo è il metodo che viene chiamato alla pressione del tasto Carica

    codice:
    public static void openfile(File f) throws IOException {
    		String lcogn;
    		String lnome;
    		String lnumb;
    		String laddr;
    		String lcity;
    		String empty;
    		String nomecogno;
    		String divido[] = new String[2];
    		String reco;
    		String temp;
    		ogg1 = new MiaClasse();
    		int line = 0;
    		
    		list.clear();
    		
    		FileReader file = new FileReader(f);
    		BufferedReader bufread = new BufferedReader(file);
    		reco = bufread.readLine();
    		if(reco.compareTo(rec) != 0) {
    			JOptionPane.showMessageDialog(frame, "File non valido.", "Errore", JOptionPane.ERROR_MESSAGE, new ImageIcon(Rubrica.class.getResource("warn.png")));
    		}
    		else if(reco.compareTo(rec) == 0) {
    			JOptionPane.showMessageDialog(frame, "Rubrica caricata con successo.", "Caricamento effettuato.", JOptionPane.INFORMATION_MESSAGE, new ImageIcon(Rubrica.class.getResource("ok.png")));
    			try{
    				while (bufread.ready()){
    					
    					if(line >= 3){
    							nomecogno = bufread.readLine();
    							lnumb = bufread.readLine();
    							laddr = bufread.readLine();
    							lcity = bufread.readLine();
    							empty = bufread.readLine();
    							divido = nomecogno.split(" ");
    							lcogn = divido[0];
    							lnome = divido[1];
    							ogg1.cogn = lcogn;
    							ogg1.nome = lnome;
    							ogg1.numb = lnumb;
    							ogg1.addr = laddr;
    							ogg1.city = lcity;
    							list.add(ogg1);
    					
    					}//if
    					else temp = bufread.readLine();
    					line++;
    				}//while
    			}
    			catch(IOException e){
    				
    				System.out.println("maialone");
    			}
    		}
    		
    	}//openfile
    Questo invece quello vero e proprio per caricare i valori presenti nel .txt nella lista.
    Questi sono gli errori:
    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
    at Rubrica.openfile(Rubrica.java:196)
    at Rubrica.carica(Rubrica.java:154)
    at Rubrica.inizio(Rubrica.java:142)
    at Rubrica.<init>(Rubrica.java:43)
    at Rubrica.main(Rubrica.java:534)

    Il programma va liscio fino a quando, appena dopo aver selezionato il file da caricare, mi visualizza il messagedialog che mi avvisa che il file è stato caricato con successo e poi escono quelli!

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da burm87
    codice:
    divido = nomecogno.split(" ");
    lcogn = divido[0];
    lnome = divido[1];
    Qui sei sicuro che trova sempre due "token" separati da uno spazio???
    Perché se non sei sicuro o non lo sai a priori, dovresti fare perlomeno un test sulla lunghezza dell'array ritornato da split()!!

    E comunque vedo anche un altro errore concettuale: l'oggetto MiaClasse è solo 1 (lo istanzi all'inizio) e se fai N volte list.add(ogg1); aggiungi semplicemente lo stesso reference nella lista. Alla fine ti ritrovi con la lista che contiene N reference allo stesso oggetto e lo "stato" dell'oggetto che setti (tra l'altro accedendo direttamente ai campi .... pessima idea) è l'ultimo che hai impostato.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Utente di HTML.it L'avatar di burm87
    Registrato dal
    Aug 2009
    Messaggi
    30
    Originariamente inviato da andbin
    Qui sei sicuro che trova sempre due "token" separati da uno spazio???
    Perché se non sei sicuro o non lo sai a priori, dovresti fare perlomeno un test sulla lunghezza dell'array ritornato da split()!!

    E comunque vedo anche un altro errore concettuale: l'oggetto MiaClasse è solo 1 (lo istanzi all'inizio) e se fai N volte list.add(ogg1); aggiungi semplicemente lo stesso reference nella lista. Alla fine ti ritrovi con la lista che contiene N reference allo stesso oggetto e lo "stato" dell'oggetto che setti (tra l'altro accedendo direttamente ai campi .... pessima idea) è l'ultimo che hai impostato.
    Sul fatto dei due token separati no nn sono sicuro, ma cmq anke commentando la parte dell'array e inserendo solamente le stringhe parte l'eccezione. Si l'oggetto è uno solo ma ad ogni ciclo i vari campi (ogg1.numb, ogg1.city, ecc) vengono sovrascritti no? e quindi facendo list.add(ogg1) lui mette in coda si di nuovo ogg1, ma i valori all'interno dei vari ogg1 sono differenti. Sbaglio?

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da burm87
    Sul fatto dei due token separati no nn sono sicuro, ma cmq anke commentando la parte dell'array e inserendo solamente le stringhe parte l'eccezione.
    La eccezione che avevi indicato è molto chiara:

    at Rubrica.openfile(Rubrica.java:196)

    Quale è la riga 196??
    E comunque ti dà un'altra eccezione? Guarda la riga!!

    Originariamente inviato da burm87
    Si l'oggetto è uno solo ma ad ogni ciclo i vari campi (ogg1.numb, ogg1.city, ecc) vengono sovrascritti no? e quindi facendo list.add(ogg1) lui mette in coda si di nuovo ogg1, ma i valori all'interno dei vari ogg1 sono differenti. Sbaglio?
    Certo che "sovrascrivi" i campi ... ma l'oggetto è 1 solo, quindi alla fine ai N elementi (sono dei reference!) nella lista che fanno riferimento allo stesso oggetto e lo stato dell'oggetto è l'ultimo che hai impostato!!! Ti "perdi" gli "stati" precedenti che avevi impostati in cicli precedenti.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    Utente di HTML.it L'avatar di burm87
    Registrato dal
    Aug 2009
    Messaggi
    30
    La riga 196 è questa: lnome = divido[1]; tutte le eccezioni che mi da le ho incollate.

    Si ma scusa l'ignoranza, se il list.add(ogg1) è un'istruzione dentro all'if in fondo al ciclo nn la dovrebbe ripetere ad ogni giro? Quindi ai primi 3 giri nn entra nell'if xke ho nel file le righe vuote, poi dal quarto giro entra nell'if ed esegue tutte le istruzioni dell'if quindi facendo list.add(ogg1) l'oggetto viene inserito in lista, al giro dopo anke se perdo gli stati precedenti non mi interessa xke sono già inseriti in lista ed aggiungo il record "nuovo" appena letto. Almeno credevo fosse così insomma

  9. #9
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da burm87
    La riga 196 è questa: lnome = divido[1]; tutte le eccezioni che mi da le ho incollate.
    Appunto! Vuol dire che l'array non ha 2 elementi ma solo 1. Puoi usare divido[0] ma non c'è l'indice 1 quindi non puoi fare divido[1].

    Originariamente inviato da burm87
    xke sono già inseriti in lista
    Senti, a parte quel test sulla riga (che non mi interessa), è possibile che il "flusso" di esecuzione sia tale per cui esegui quel list.add(ogg1); più volte in ciclo??
    E' possibile? E allora è sbagliato.

    Se fai 3 volte il add(), nella lista hai 3 reference:
    codice:
        +---+
      0 |   |--------
        +---+        \
      1 |   |-------> MiaClasse (cogn, nome, ....)
        +---+        /
      2 |   |--------
        +---+
    Lo ripeto: l'oggetto è 1 solo. Quindi lo "stato" è 1 solo. Quando aggiungi il primo elemento il primo stato è impostato ok. Quando aggiungi il secondo elemento, sovrascrivi lo stato ma dello stesso oggetto di prima!!! Ecc...
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  10. #10
    Utente di HTML.it L'avatar di burm87
    Registrato dal
    Aug 2009
    Messaggi
    30
    Ok quindi significa che la split non returna due token nell'array giusto? Cmq ti ho scritto un mes privato che qua inizio ad impazzire

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.