Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 17
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2013
    Messaggi
    104

    [JAVA] Metodi getter e setter di una classe che estende ArrayList

    Devo scrivere un progetto per la gestione degli esami degli studenti di un corso di laurea.
    In parole povere ho creato una classe Studente contenente i dati anagrafici, una classe Elenco (extends ArrayList) in cui, appunto, inserisco tutti gli studenti.

    Ho qualche problema con i metodi set e get dell'ultima classe descritta cioè: quando inserisco nella maschera di input i dati degli studenti nei vari textField e clicco il button "Aggiungi", in console ricevo l'errore:
    - Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError
    at studenti.ElencoStudenti.getMatricola(ElencoStudent i.java:41)"

    Allego l'immagine della maschera e inserisco il frammento di codice del bottone "Aggiungi" e il codice relativo alla classe Elenco

    codice:
    private void bottoneAggiungiActionPerformed(java.awt.event.ActionEvent evt) {                                                
            // TODO add your handling code here:
            
            e.addStudente(matricola.getText(), cognome.getText(), nome.getText(), appello.getSelectedItem(), voto.getSelectedItem());
            
            if (d.exists() != true) {
                d.newDoc();
                try {
                    d.scrivi(e, i);
                } catch (IOException ex) {
                    Logger.getLogger(mainFrame.class.getName()).log(Level.SEVERE, null, ex);
                }
            } else {            
                    
                try {          
                    d.scrivi(e, i);
                } catch (IOException ex) {
                    Logger.getLogger(mainFrame.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
           i++;
           matricola.setText("");
           cognome.setText("");
           nome.setText("");
           appello.setSelectedIndex(0);
           voto.setSelectedIndex(0);
        }


    codice:
    public class ElencoStudenti extends ArrayList {
        
        public void addStudente(String matricola, String cognome, String nome, Object appello, Object voto) {
            Studente st = new Studente(matricola, cognome, nome, appello, voto);
            this.add(st);
        }
        
        public void setMatricola(int i, String matricola) {
            this.set(i, matricola);
        }
        
        public void setCognome(int i, String cognome) {
            this.set(i, cognome);
        }
        
        public void setNome(int i, String nome) {
            this.set(i, nome);
        }
        
        public void setVoto(int i, Object voto) {
            this.set(i, voto);
        }
        
        public void setAppello(int i, Object appello) {
            this.set(i, appello);
        }
        
        public String getMatricola(int i) {
            return this.getMatricola(i);
        }
        
        public String getCognome(int i) {
            return this.getCognome(i);
        }
        
        public String getNome(int i) {
            return this.getNome(i);
        }
        
        public Object getVoto(int i) {
            return this.getVoto(i);
        }
        
        public Object getAppello(int i) {
            return this.getAppello(i);
        }
    }
    Qualcuno potrebbe indirizzarmi verso la giusta via?
    PS. spero di non aver sbagliato nulla nella creazione di tale topic (è il mio primo messaggio non mi mangiate!)
    Immagini allegate Immagini allegate

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [JAVA] Metodi getter e setter di una classe che estende ArrayList

    Originariamente inviato da LuLyLuNa
    quando inserisco nella maschera di input i dati degli studenti nei vari textField e clicco il button "Aggiungi", in console ricevo l'errore:
    - Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError
    at studenti.ElencoStudenti.getMatricola(ElencoStudent i.java:41)"
    codice:
        public String getMatricola(int i) {
            return this.getMatricola(i);
        }
    Richiama sé stesso

    Ma c'è un altro problema ... più grave. Il tuo addStudente aggiunge in lista un oggetto Studente ma ... gli altri setXyz che hai messo settano un elemento della lista con oggetti di altro tipo es. String.
    Che senso ha? Volevi settare la matricola dello Studente all'indice i-esimo? Ok, ma non è solo con this.set(i, matricola); che lo fai.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2013
    Messaggi
    104
    Allora innanzitutto ti ringrazio per la celere risposta...
    Vorrei analizzare un problema per volta se per te va bene xD

    Ho riscritto la classe Elenco seguendo le esercitazioni che avevo scritto con un amico a casa.. Però, e non ridere, non so xkè i getter e i setter li scrivevamo così!

    codice:
    public class ElencoStudenti extends ArrayList {
        
        public void addStudente(String matricola, String cognome, String nome, Object appello, Object voto) {
            Studente st = new Studente(matricola, cognome, nome, appello, voto);
            this.add(st);
        }
        
        public String getMatricola(int i){
            Studente temp;
            temp = (Studente) this.get(i);
            return temp.getMatricola();
        }
        
        public String getCognome(int i){
            Studente temp;
            temp = (Studente) this.get(i);
            return temp.getCognome();
        }
        
        public String getNome(int i){
            Studente temp;
            temp = (Studente) this.get(i);
            return temp.getNome();
        }
        
        public Object getAppello(int i){
            Studente temp;
            temp = (Studente) this.get(i);
            return temp.getAppello();
        }
        
        public Object getVoto(int i){
            Studente temp;
            temp = (Studente) this.get(i);
            return temp.getVoto();
        }
        
        public void setMatricola(int i, String matricola){
            Studente temp;
            temp = (Studente) this.get(i);
            temp.setMatricola(matricola);
        }
        
        public void setCognome(int i, String cognome){
            Studente temp;
            temp = (Studente) this.get(i);
            temp.setCognome(cognome);
        }
        
        public void setNome(int i, String nome){
            Studente temp;
            temp = (Studente) this.get(i);
            temp.setNome(nome);
        }
        
        public void setAppello(int i, Object appello){
            Studente temp;
            temp = (Studente) this.get(i);
            temp.setAppello(appello);
        }
        
        public void setVoto(int i, Object voto){
            Studente temp;
            temp = (Studente) this.get(i);
            temp.setVoto(voto);
        }
    }
    In questo modo, tutto funziona!
    Altro problema è che anche lui deve presentare questo progetto quindi non volevo utilizzare questo metodo sapendo che lo usa anche lui!

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    157
    Stai duplicando il lavoro per niente.

    codice:
    public class ElencoStudenti extends ArrayList {
        public Studente getStudente(int id){
            return this.get(i);
        }
    }
    in questo modo, dall'oggetto studente restituito, puoi accedere a tutti i campi.
    tipo:
    Studente stud = elenco.getStudente(500);
    stud.getNome();
    stud.getVoto();
    eccetera.

    a questo punto, il metodo getStudente diventa inutile, e puoi usare il metodo get(i) di ArrayList.

    Inoltre cosa buona e giusta sarebbe tipizzare la classe ArrayList:
    public class ElencoStudenti extends ArrayList
    diventa
    public class ElencoStudenti extends ArrayList<Studente>
    in questo modo potrai inserire solo studenti, o classi che derivano da Studente.

    A questo punto, la classe ElencoStudenti diventa quasi inutile, ma vedi te se tenerla o usare direttamente un ArrayList<Studente>

  5. #5
    Utente di HTML.it L'avatar di alexmaz
    Registrato dal
    May 2001
    Messaggi
    972
    Ma per curiosità, qual'è il tuo livello di conoscienza di Java? Devi per forza usare un ArrayList? Per come è ora la classe, duplichi le operazioni che potresti fare direttamente sullo studente in operazioni che fai su ElencoStudenti, fra l'altro prendendoli attraverso un indici arbitrario. Io farei una cosa del genere



    codice:
    public class ElencoStudenti {
    	
    	private Map<String, Studente> mMap;
    	
    	public ElencoStudenti(){
    		this(new HashMap<String, Studente>());
    	}
    	
    	public ElencoStudenti(Map<String, Studente> studenti){
    		mMap = studenti;
    	}
    	
    	public void add(Studente studente){
    		mMap.put(studente.getMatricola(), studente);
    	}
    	
    	public void add(String nome, String cognome, String matricola){
    		Studente studente = new Studente(nome, cognome, matricola);
    		add(studente);
    	}
    	
    	public Studente get(String matricola){
    		return mMap.get(matricola);
    	}
    }
    e per fare operazioni sul singolo studente elencoStudenti.get(matricola).getAppello() per esempio.
    The individual has always had to struggle to keep from being overwhelmed by the tribe. If you try it, you will be lonely often, and sometimes frightened. But no price is too high to pay for the privilege of owning yourself.

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2013
    Messaggi
    104
    Originariamente inviato da cigiri18
    Stai duplicando il lavoro per niente.

    codice:
    public class ElencoStudenti extends ArrayList {
        public Studente getStudente(int id){
            return this.get(i);
        }
    }
    in questo modo, dall'oggetto studente restituito, puoi accedere a tutti i campi.
    tipo:
    Studente stud = elenco.getStudente(500);
    stud.getNome();
    stud.getVoto();
    eccetera.

    a questo punto, il metodo getStudente diventa inutile, e puoi usare il metodo get(i) di ArrayList.

    Inoltre cosa buona e giusta sarebbe tipizzare la classe ArrayList:
    public class ElencoStudenti extends ArrayList
    diventa
    public class ElencoStudenti extends ArrayList<Studente>
    in questo modo potrai inserire solo studenti, o classi che derivano da Studente.

    A questo punto, la classe ElencoStudenti diventa quasi inutile, ma vedi te se tenerla o usare direttamente un ArrayList<Studente>


    codice:
    public class ElencoStudenti extends ArrayList {
        public Studente getStudente(int id){
            return this.get(i);
        }
    }
    Scrivendo in questo modo mi evito tutti i paragiri di setter e getter che mi duplicano il lavoro, giusto?

  7. #7
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    157
    sì.

  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2013
    Messaggi
    104
    Originariamente inviato da alexmaz
    Ma per curiosità, qual'è il tuo livello di conoscienza di Java? Devi per forza usare un ArrayList? Per come è ora la classe, duplichi le operazioni che potresti fare direttamente sullo studente in operazioni che fai su ElencoStudenti, fra l'altro prendendoli attraverso un indici arbitrario. Io farei una cosa del genere



    codice:
    public class ElencoStudenti {
    	
    	private Map<String, Studente> mMap;
    	
    	public ElencoStudenti(){
    		this(new HashMap<String, Studente>());
    	}
    	
    	public ElencoStudenti(Map<String, Studente> studenti){
    		mMap = studenti;
    	}
    	
    	public void add(Studente studente){
    		mMap.put(studente.getMatricola(), studente);
    	}
    	
    	public void add(String nome, String cognome, String matricola){
    		Studente studente = new Studente(nome, cognome, matricola);
    		add(studente);
    	}
    	
    	public Studente get(String matricola){
    		return mMap.get(matricola);
    	}
    }
    e per fare operazioni sul singolo studente elencoStudenti.get(matricola).getAppello() per esempio.
    No non devo usare per forza un ArrayList.. Sono qui proprio x chiedere aiuto!

  9. #9
    Utente di HTML.it
    Registrato dal
    Sep 2013
    Messaggi
    104
    Originariamente inviato da cigiri18
    sì.

    Grazie mille!!!!!!!

  10. #10
    Utente di HTML.it
    Registrato dal
    Sep 2013
    Messaggi
    104
    Adesso questa è la mia classe ElencoStudenti

    codice:
    public class ElencoStudenti extends ArrayList<Studente> {
        
        public void addStudente(String matricola, String cognome, String nome, Object appello, Object voto) {
            Studente st = new Studente(matricola, cognome, nome, appello, voto);
            this.add(st);
        }
        
        public Studente getStudente(int i){
            return this.get(i);
        }
        
    }
    E in questo modo scrivo sul file:
    codice:
        public void scrivi(ElencoStudenti e, int i) throws IOException{      
            FileWriter f = new FileWriter(doc, true);
            f.write(e.getStudente(i).getMatricola()+" - "+e.getStudente(i).getCognome()+" - "+e.getStudente(i).getNome()+" - "+e.getStudente(i).getAppello()+" - "+e.getStudente(i).getVoto()+"\r\n");  
            f.close();
        }

    Thanks!!!!!!!!!!!

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.