Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Microsoft Surface Pro 12 è il 2 in 1 più compatto e silenzioso
Microsoft Surface Pro 12 è il 2 in 1 più compatto e silenzioso
Basato su piattaforma Qualcomm Snapdragon X Plus a 8 core, il nuovo Microsoft Surface Pro 12 è un notebook 2 in 1 molto compatto che punta sulla facilità di trasporto, sulla flessibilità d'uso nelle differenti configurazioni, sul funzionamento senza ventola e sull'ampia autonomia lontano dalla presa di corrente
Recensione REDMAGIC Astra Gaming Tablet: che spettacolo di tablet!
Recensione REDMAGIC Astra Gaming Tablet: che spettacolo di tablet!
Il REDMAGIC Astra Gaming Tablet rappresenta una rivoluzione nel gaming portatile, combinando un display OLED da 9,06 pollici a 165Hz con il potente Snapdragon 8 Elite e un innovativo sistema di raffreddamento Liquid Metal 2.0 in un form factor compatto da 370 grammi. Si posiziona come il tablet gaming più completo della categoria, offrendo un'esperienza di gioco senza compromessi in mobilità.
Dopo un mese, e 50 foto, cosa abbiamo capito della nuova Nintendo Switch 2
Dopo un mese, e 50 foto, cosa abbiamo capito della nuova Nintendo Switch 2
Dopo un mese di utilizzo intensivo e l'analisi di oltre 50 scatti, l'articolo offre una panoramica approfondita di Nintendo Switch 2. Vengono esaminate le caratteristiche che la definiscono, con un focus sulle nuove funzionalità e un riepilogo dettagliato delle specifiche tecniche che ne determinano le prestazioni
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 22-01-2010, 10: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 10:46.
YSN è offline   Rispondi citando il messaggio o parte di esso
Old 22-01-2010, 11: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, 11: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 10:07.
YSN è offline   Rispondi citando il messaggio o parte di esso
Old 22-01-2010, 13: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, 22: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 22:42.
YSN è offline   Rispondi citando il messaggio o parte di esso
Old 22-01-2010, 23: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, 10: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 10:15.
YSN è offline   Rispondi citando il messaggio o parte di esso
Old 26-01-2010, 10: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


Microsoft Surface Pro 12 è il 2 in 1 più compatto e silenzioso Microsoft Surface Pro 12 è il 2 in 1 pi&u...
Recensione REDMAGIC Astra Gaming Tablet: che spettacolo di tablet! Recensione REDMAGIC Astra Gaming Tablet: che spe...
Dopo un mese, e 50 foto, cosa abbiamo capito della nuova Nintendo Switch 2 Dopo un mese, e 50 foto, cosa abbiamo capito del...
Gigabyte Aero X16 Copilot+ PC: tanta potenza non solo per l'IA Gigabyte Aero X16 Copilot+ PC: tanta potenza non...
vivo X200 FE: il top di gamma si è fatto tascabile? vivo X200 FE: il top di gamma si è fatto ...
Il decimo lancio del razzo spaziale Spac...
Nuova immagine per la cometa interstella...
Usi la 'melanzana' su Tinder? Ecco perch...
AWS annuncia molte novità legate ...
Il lato oscuro della speculazione immobi...
Glyph Matrix e design asimmetrico: ...
Il sasso più costoso di sempre: p...
Ericsson punta sull'IA: arrivano nuove s...
Iliad: GIGA 200 e GIGA 150 tra le offert...
Questo power bank wireless ricarica alla...
iPhone 17 Pro e Pro Max: il nu...
Riunioni su Teams direttamente dall'auto...
È record: il nuovo orologio atomi...
Giochi per adulti cancellati da Steam: i...
Lefant M330Pro crolla a 127,49€, offerta...
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: 03:13.


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