Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Roborock Saros 20: il robot preciso e molto sottile
Roborock Saros 20: il robot preciso e molto sottile
Il nuovo robot di Roborock per l'aspirazione della polvere e il lavaggio dei pavimenti spicca per immediatezza d'uso e per l'efficacia dell'azione, grazie anche a un ridotto sviluppo in altezza. Saros 20 integra un motore da ben 36.000Pa di potenza e un sistema di lavaggio a due panni rotanti, con bracci estensibili e un sistema di navigazione molto preciso.
ASUS ROG Kithara: quando HIFIMAN incontra il gaming con driver planari da 100mm
ASUS ROG Kithara: quando HIFIMAN incontra il gaming con driver planari da 100mm
ASUS e HIFIMAN uniscono le forze per creare ROG Kithara, cuffie gaming con driver magnetici planari da 100mm, design open-back e microfono MEMS full-band. Una proposta che ambisce a coniugare fedeltà per audiofili e performance ludiche, disponibili a 319 euro
Roborock Qrevo Curv 2 Flow: ora lava con un rullo
Roborock Qrevo Curv 2 Flow: ora lava con un rullo
Qrevo Curv 2 Flow è l'ultima novità di casa Roborock per la pulizia di casa: un robot completo, forte di un sistema di lavaggio dei pavimenti basato su rullo che si estende a seguire il profilo delle pareti abbinato ad un potente motore di aspirazione con doppia spazzola laterale
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 22-01-2010, 11:35   #1
YSN
Member
 
Iscritto dal: Oct 2008
Messaggi: 112
[JAVA] Problema di accesso ad una variabile privata e sollevo eccezione

Salve ci ho questo esercizio da svolgere:

È necessario scrivere un’applicazione Java che consenta di effettuare la gestione dei dati relativi agli iscritti di
una scuola militare. Ciascun iscritto, rappresentato da una matricola (di 5 cifre, es. ‘23678’), nome e cognome,
può frequentare i corsi annuali della scuola. Ciascun corso è caratterizzato da un codice identificativo unico, la
denominazione, la data di inizio e di fine, e prevede una esercitazione pratica. L’esercitazione può svolgersi in
un campo militare, che è a sua volta caratterizzato da un nome e un indirizzo (es. ‘Campo Seagate’, ‘Via del
Tronto, 23 - Bari’), e da una serie di attrezzature che servono per lo svolgimento dell’esercitazione stessa (es.
‘Paracadute’, ‘Tuta mimetica’, ‘Elicottero’ etc.).


1--Utente inserisce iscritti ai corsi da input
2--Utente visualizza esercitazioni per iscritto
3--Utente restituisce l’iscritto che ha partecipato al numero più alto di esercitazioni con il paracadute;
4--Utente cerca per ogni attrezzatura usata nelle esercitazioni gli iscritti che l’hanno usata

io ho proceduto in questo modo:
1--ho dichiarato una classe di nome "Iscritto".
2--ho dichiarato un'altra classe di nome "Corso", nella quale ho dichiarato le variabili : (codiceCorso, nomeCorso, dataInizio, dataFine, nomeCampo, indirizzo, attrezzature e una collezione di Iscritto "ArrayList<Iscritto>")
3--ho dichiarato una classe di nome Scuola, nella quale ho messo i vari metodi che implamentano i casi d'uso.
il primo metodo che mi permette l'inserimento degli iscritti, i corsi e le esercitazioni. e FUNZIONA
ho implementato un secondo metodo che mi permette di stampare tutti gli iscritti coi relativi corsi e FUNZIONA

il problema inzia quando devo implamentare il metodi che mi permette di visualizzare l'esercitazione per iscritto.

public void stampaEserc(String matricola){

if(lista.size() == 0){
System.out.println("Lista vuota");
} else {
for(int i = 0; i < lista.size(); i++){
if(lista.get(i).getIscritto().get(i).getMatr().equals(matricola)){
System.out.println("Nome campo eserc. : " + lista.get(i).getNomeCampo() + "\n" +
"Indirizzo campo : " + lista.get(i).getIndir() + "\n" +
"Attrezzature util. : " + lista.get(i).getAttrezz() + "\n");
}
}
}
}


praticamente il metodo deve cercare di la matricola e se la trova deve stampare a video le esercitazioni a cui ha partecipato.

Quando al metodo passo la matricola mi stampa solo la prima esercitazione e poi solleva un'eccezione di tipo IndexOutOfBoundsException.

non so il perchè?

help me please, sono disperato...

se volete che vi mostro tutto il codice non è un problema

Ultima modifica di YSN : 22-01-2010 alle 11:46.
YSN è offline   Rispondi citando il messaggio o parte di esso
Old 22-01-2010, 12:22   #2
vladix
Member
 
L'Avatar di vladix
 
Iscritto dal: Jan 2008
Città: roma
Messaggi: 296
Quote:
Originariamente inviato da YSN Guarda i messaggi
if(lista.get(i).getIscritto().get(i).getMatr().equals(matricola))
e qui che scatta l'eccezzione IndexOutOfBoundsException. Tu hai 2 liste : la prima e la variabile lista e la seconda e lista e il risultato del metodo getIscritto ( o almeno cosi sembrerebbe da come hai scritto ) .
Il tuo problema e che usi lo stesso index per tutte e due le liste senza preoccuparti di quanti elementi ci sono nella seconda lista . per come hai fatto tu la seconda lista dovrebbe essere valorizatta in questo modo

index 0 contiene un elemento
index 1 contiene due elementi
index 3 contiene 3 elementi e cosi via , e a ogni ciclo ti visualizza la posizione "index" della seconda lista e se nn c'e va in errore.

La cosa da fare e ciclare anche sulla seconda lista .
vladix è offline   Rispondi citando il messaggio o parte di esso
Old 22-01-2010, 12:42   #3
YSN
Member
 
Iscritto dal: Oct 2008
Messaggi: 112
per intenderci ti scrivo il codice:
Codice:
Questa è la classe CorsoEserc:
public class CorsoEserc{
    
    private ArrayList<Iscritto> iscritto = new ArrayList<Iscritto>();
    private String codCso;
    private String denomin;
    private String dataIn;
    private String dataFn;
    private String nomeCampo;
    private String indir;
    private String attrez;
    
	//Nel costruttore ho inizializzato tutti i campi istanza, e all'ArrayList ho aggiunto un iscritto
    public CorsoEserc(Iscritto i, String codCso, String denomin, String dataIn, String dataFn, 
                    String nomeCampo, String indir, String attrez){
        
        iscritto.add(i);
        this.codCso = codCso;
        this.denomin = denomin;
        this.dataIn = dataIn;
        this.dataFn = dataFn;
        this.nomeCampo = nomeCampo;
        this.indir = indir;
        this.attrez = attrez;
    }
    public void setIscritto(ArrayList<Iscritto> iscritto){
        this.iscritto = iscritto;
    }
    
    public void setCodCso(String codCso){
        this.codCso = codCso;
    }
   ...........
   il resto del codice sono metodi sete get dei campi istanza//
}



//Questa è la classe Iscritto
public class Iscritto{

    private String matr;
    private String nome;
    private String cognome;
    
    public Iscritto(){
        this.matr = "";
        this.nome = "";
        this.cognome = "";
    }
    
    public Iscritto(String matr, String nome, String cognome){
        this.matr = matr;
        this.nome = nome;
        this.cognome = cognome;
    }
    ...................
//Il resto del codice sono metodi set e get dei campi istanza
}

//Questa è la classe Scuola nella quale ci sono i vari metodi
public class Scuola{
    
    private ArrayList<CorsoEserc> lista = new ArrayList<CorsoEserc>();
    
	//Questo è il metodo d'inserimento FUNZIONA
    public void inserisci(String matr, String nome, String cognome, String codCso, String denomin, 
            String dataIn, String dataFn, String nomeCampo, String indir, String attrez){
        
        Iscritto iscr = new Iscritto(matr, nome, cognome);
        CorsoEserc csoEs = new CorsoEserc(iscr, codCso, denomin, dataIn, dataFn, nomeCampo, indir, attrez);
        
        lista.add(csoEs);
    }
    
    public String stampaCE(CorsoEserc ce){
        return ce.toString();
    }
    
	//Ho implemetato questo metodo per  poter verifivare l'esattezza dell'inserimento e FUNZIONA
    public void stampa(){
        if(lista.size() == 0){
            System.out.println("Lista vuota");
        } else {
            for(int i = 0; i < lista.size(); i++){
                System.out.println(lista.get(i).getIscritto().toString() + stampaCE(lista.get(i)));
                System.out.println();
                System.out.println();
            }
        }
    }
    
	/*
		Qua inizia il problema perchè devo accedere alla variabile private matricola della classe Iscritto
		riesco ad accedere così("tmp.getIscritto().get(i).getMatr()")e va bene, ma questo metodo, mi stampa solo la prima     esercitazione 
		e poi mi solleva la famosa eccezione "IndexOutOfBoundsException" e l'applicazione si conclude.
		
	*/
	
    public void stampaEserc(String matricola){
        CorsoEserc tmp = null;
        if(lista.size() == 0){
            System.out.println("Lista vuota");
        } else {
            for(int i = 0; i < lista.size(); i++){
                tmp = lista.get(i);
                if(tmp.getIscritto().get(i).getMatr().equals(matricola)){
                    System.out.println("Nome campo eserc.   : " + lista.get(i).getNomeCampo() + "\n" +
                                       "Indirizzo campo     : " + lista.get(i).getIndir() + "\n" +
                                       "Attrezzature util.  : " + lista.get(i).getAttrezz() + "\n");
                }
            }
        }
    }
                
}
Mi spieghi più meno come devo procedere, può darsi anche che l'implentazione iniziale del codice è errata
Grazie davvero

Ultima modifica di YSN : 26-01-2010 alle 11:07.
YSN è offline   Rispondi citando il messaggio o parte di esso
Old 22-01-2010, 14:26   #4
khelidan1980
Senior Member
 
L'Avatar di khelidan1980
 
Iscritto dal: Mar 2005
Città: Morimondo city
Messaggi: 5491
ma getIscritto cosa ritorna?Perche ci fai un nuovo get di sopra?
Poi usa il tag code che non si capisce niente, quel metodo non lo mica trovato
__________________
Khelidan
khelidan1980 è offline   Rispondi citando il messaggio o parte di esso
Old 22-01-2010, 23:40   #5
YSN
Member
 
Iscritto dal: Oct 2008
Messaggi: 112
Siccome iscritto è private, per accederci ho pensato a:
Codice:
    public ArrayList<Iscritto> getIscritto(){
        return this.iscritto;
    }

Ultima modifica di YSN : 22-01-2010 alle 23:42.
YSN è offline   Rispondi citando il messaggio o parte di esso
Old 23-01-2010, 00:41   #6
clockover
Senior Member
 
L'Avatar di clockover
 
Iscritto dal: Oct 2004
Messaggi: 1945
Quote:
Originariamente inviato da YSN Guarda i messaggi
Siccome iscritto è private, per accederci ho pensato a:
Codice:
    public ArrayList<Iscritto> getIscritto(){
        return this.iscritto;
    }
Non ho letto il codice completo ma questa parte, anche se giusta, non andrebbe fatta!

Eseguendo
Codice:
return this.iscritto;
tu dai la possibilità al cliente di modificare a suo piacimento quella lista!

E' conveniente invece
Codice:
return this.iscritto.clone();
Ha proprio la faccia di un esercizio di progettazione in UML!

P.S.
leva quei colori e definisci un tag code per ogni classe, si legge sicuramente meglio!
clockover è offline   Rispondi citando il messaggio o parte di esso
Old 26-01-2010, 11:05   #7
YSN
Member
 
Iscritto dal: Oct 2008
Messaggi: 112
allora io comunque ho proceduto su suggerimento di vladix, infatti siccome uso lo stesso indice per entrambe le liste, solleva leccezione.ho fatto un ciclo nidificato e ora mi funziona.
Codice:
public void ricercaEsPerIscritto(String matricola){
	      CorsoEserc tmp = null;
              if(lista.size() == 0){
                System.out.println("Lista vuota");
             } else {
		int conta = 0;
                for(int i = 0; i < lista.size(); i++){
                    tmp = lista.get(i);
		    for(int j = 0; j < tmp.getIscritto().size(); j++){
		        if(tmp.getIscritto().get(j).getMatr().equals(matricola)){
			    conta++;
			}
		    }
		 }
        	 if(conta > 0){
		     for(int i = 0; i < lista.size(); i++){
			tmp = lista.get(i);
			for(int j = 0; j < tmp.getIscritto().size(); j++){
			    if(tmp.getIscritto().get(j).getMatr().equals(matricola)){
				stampaEsercitazione(i);
			    }
			}
		      }
		 } else {
		      System.out.println("Errore");
	         }
	     }
    }
mi manca solo il caso d'uso 3 "Utente restituisce l’iscritto che ha partecipato al numero più alto di esercitazioni con il paracadute".

che non ho la più pallida idea come devo procedere...

Ultima modifica di YSN : 26-01-2010 alle 11:15.
YSN è offline   Rispondi citando il messaggio o parte di esso
Old 26-01-2010, 11:17   #8
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Usare il colore verde per evidenziare il codice non e' stata una bella idea... i miei bulbi occulari già privi del giusto sonno sono stati a rischio esplosione dopo 5 sec...

Comunque, nel metodo getIscritto() (che dal nome uno potrebbe legittimamente supporre di ricevere un Iscritto, non una lista di oggetti) invece di restituire il riferimento alla lista stessa si può restituire un riferimento ad una "vista" di quella lista:
Codice:
public ArrayList<Iscritto> getIscritto(){
    return Collections.unmodifiableList(this.iscritto);
}
Il chiamante può usare la "vista" per consultare la lista, ma se prova a modificarla (sia direttamente che usando l'iteratore prodotto tramite la vista restituita) parte in quarta una UnsupportedOperationException.
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Roborock Saros 20: il robot preciso e molto sottile Roborock Saros 20: il robot preciso e molto sott...
ASUS ROG Kithara: quando HIFIMAN incontra il gaming con driver planari da 100mm ASUS ROG Kithara: quando HIFIMAN incontra il gam...
Roborock Qrevo Curv 2 Flow: ora lava con un rullo Roborock Qrevo Curv 2 Flow: ora lava con un rull...
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite Alpine A290 alla prova: un'auto bella che ti fa ...
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile Recensione HONOR Magic 8 Lite: lo smartphone ind...
Il computer quantistico minaccia l'HTTPS...
TCL al MWC annuncia la tecnologia NXTPAP...
AGCOM mette nel mirino la ricerca AI di ...
'Pago 6.000 dollari al mese': il fondato...
Qualcomm lancia al MWC 2026 il Wi-Fi 8 e...
Qualcomm Snapdragon Wear Elite: IA da 2 ...
Bombe sull'Iran: il Pentagono avrebbe us...
ASUS e Kojima Productions hanno realizza...
Micron apre un impianto legato a DRAM e ...
Fine dei PC economici: quelli sotto i 50...
Honor al MWC 2026: Robot Phone, lo smart...
NVIDIA ha superato Apple: adesso è...
Samsung non abbandonerà la S-Pen:...
Fibra ottica e monitoraggio sismico: acc...
La nuova Xbox è già morta,...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 09:19.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v