Visualizzazione dei risultati da 1 a 9 su 9

Hybrid View

  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2016
    Messaggi
    12
    Quote Originariamente inviata da Ansharja Visualizza il messaggio
    Per le prossime volte ricordati che dire "non funziona" � troppo generico, specifica meglio i problemi che riscontri, che siano eccezioni a runtime (vedo che nei commenti parli di NullPointerException), o comportamenti inaspettati del programma.

    Il codice che hai inserito per� � incompleto e abbastanza incasinato (troppe righe vuote e indentamento confusionario), posta un codice che sia possibile compilare ed eseguire, cos� si fa molto prima a trovare gli errori...

    Ecco comunque alcune cose che si notano subito:

    - Non � corretto passare a Monoposto nel costruttore un vettore di oggetti Driver, Monoposto deve contenere un solo Driver, questo � abbastanza ovvio...
    - Non dovresti costruire pi� Random, come detto ne basta uno, ma se non vuoi assegnarlo a una variabile di Race (e usare poi quello nei diversi metodi), almeno crealo all'inizio dei vari metodi ma comunque fuori dai cicli...

    In generale poi quando ottieni eccezioni a runtime dovresti fare una sorta di "debug" in cui stampi i valori di tutte le variabili che possono causare l'eccezione, e poi risali indietro fino al momento dell'assegnazione dei valori per capire come mai sono ancora null: quasi sempre ti sarai dimenticato di inizializzare la variabile o starai eseguendo un metodo su di essa prima di averla creata, poi ci sono anche altri casi ovviamente.

    Se posti il codice completo comunque ti posso dire molto di pi�

    Guarda mi dispiace tanto per la confusione, purtroppo il problema di imparare le cose da soli � che si impara con lacune... e mi dispiace che ti sto assillando da un po' ormai

    Comunque il codice l'ho cambiato di nuovo alla fine, i due array erano confusionari quindi ho tolto l'array drivers e ho lasciato solamente cars, dentro il quale ho istanziato i piloti. ora il programma funziona, a parte il fatto che non stampa i nomi dei piloti, ma stampa:

    Driver@6d06d69c
    Driver@7852e922
    Driver@4e25154f
    Driver@70dea4e
    Driver@5c647e05
    Driver@33909752
    The winner is Driver@7852e922

    L'errore penso sia piccolo, ma io ormai ci sto impazzendo dietro a questo programma

    comunque eccoti il codice completo:

    codice:
    public class Application {
    	public static void main(String []args){
    		
    		
    
    
            Monoposto[] cars = new Monoposto[6];
    
    
    	    cars[0] = new Monoposto ("Ferrari I", new Driver ("Kimi", "Raikkonen"));	
            cars[1] = new Monoposto ("Ferrari II", new Driver ("Sebastian", "Vettel"));
            cars[2] = new Monoposto ("Mclaren I", new Driver ("Fernando", "Alonso")); 
            cars[3] = new Monoposto ("Mclaren II", new Driver ("Sergio", "Perez"));
            cars[4] = new Monoposto ("Mercedes I", new Driver ("Nico", "Rosberg"));
            cars[5] = new Monoposto ("Mercedes II", new Driver ("Louis", "Hamilton"));
    
    
    
    
    	Race grandprix = new Race();
    	Track track = new Track("Monza", "Italy", 70);
    	grandprix.setTrack(track);		
    	
    	grandprix.setCars(cars);		
    	grandprix.startRace();
    	grandprix.findWinner();
    	
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    }
    } 
    
    
    ***                                            ***                                 ***
    
    import java.util.Random;
    public class Race {
    	
    	
    		
    		private  Monoposto[] cars;   
    		Track track;
    		
    		    
    
    
    
    
    			
    			
    			
    	        public void startRace(){
    				track.announceTrack();
    				System.out.println("    3...");			   
    				System.out.println("    2...");			   
    			    System.out.println("    1...");			  
    			    System.out.println("   GO!   ");     
    											
    		 	        for (int i = 0; i < cars.length; i++){ 
    						cars[i].turnOn();		        
    						Random increment = new Random();                                                                       
    				        cars[i].setPoints(increment.nextInt(100));				
    									
    			       }
    			    }   
    	      	   
    		    
    			
    	                
    
    
    		    public void findWinner(){	
    			for (int i = 0; i < track.getLaps(); i++){
    			     for (int z = 0; z < cars.length; z++){ 
    			         Random increment = new Random();                                                       
    				 cars[z].setPoints(cars[z].getPoints() + increment.nextInt(100));	      									
    		              }
    			System.out.println("Lap: " + i);
    			
    	                 }
    			
    
    
    			 int max = 0;
    			 Driver winner = new Driver(); 
    			 System.out.println("\n");
    			 System.out.println("Ranking");
    			
    		       for (int i = 0; i < cars.length; i++){
    				 System.out.println(cars[i].getDriver());
    					
    				if (max <= cars[i].getPoints()){
    					max = cars[i].getPoints();
    					winner = cars[i].getDriver();
    				}
    			
    					
    		       }System.out.println("The winner is " + winner);		
    	            }
    		        
    			public void setCars(Monoposto[] cars){
    				this.cars = cars;
    
    
    			} 		 
    			
    			public Monoposto[] getCars(){
    				return cars;
    
    
    			}
    
    
    			public void setTrack(Track track){
    				this.track = track;		
    			}
    			
    			public Track getTrack(){
    				return track;
    
    
    			}
    	}
    	     
    
    
    ***                                    ***                                 ***
    
    public abstract class Vettura {
    	private String name;	
    	private int hp;
    	private int maxspeed;
    	private int points;
        private Driver driver;
        	
    	
    	public abstract void turnOn();
    	
    	public String getName(){
    		return name;	
    	}
    
    
    	public void setName (String name){
    		this.name = name;	
    	}
    
    
    	public void setDriver(String name, Driver driver){
    		this.name = name;
    		this.driver = driver;
    
    
    	} 		     
    	
    	public void setHp(int hp){
    		this.hp = hp;
    	}
        	
    	public int getHp(){
    		return hp;
    	}
    	
    		
    	public void setMaxspeed(int maxspeed){
    		this.maxspeed = maxspeed;
    	}
        	
    	public int getMaxspeed(){
    		return maxspeed;
    	}
    
    
    	public void setPoints(int points){
    		this.points = points;
    	}
        	
    	public int getPoints(){
    		return points;
    	}
    
    
    	public void setDriver(Driver driver){
    		this.driver = driver;
    
    
    	} 		 
    		
    	public Driver getDriver(){
    		return driver;
    
    
    	} 
        
        
        
        
    }
    
    
    ***                                ***                                  ***
    
    public class Monoposto extends Vettura{
      		
    		
    		public Monoposto(){
    		
    		}
    
    
    		public Monoposto(String name){
    			setName(name);			
    			setHp(600);
    			setMaxspeed(340);		
    			setPoints(0); 
    				
    		}  	
    		
    		public Monoposto(String name, Driver driver){
    			setName(name);			
    			setHp(600);
    			setMaxspeed(340);		
    			setPoints(0); 
    			setDriver(driver);	
    		}  		
    		
    		
    
    
    		public void turnOn(){
    			System.out.println(getName() + "Brum, brum");
    		}   
    		
    		
    
    
    
    
    
    
    
    
    
    
    }
    
    
    ****                                           ***                                  ***
    
    public class Driver {
    	
    		private String name;
    		private String surname;
    		private int age;
    		
    		public Driver(){
    
    
    		}
    
    
    
    
    		public Driver(String name, String surname){
    		    setName(name);
    		    setSurname(surname);
    		}
    
    
    
    
    		public String getName(){
    			return name;	
    		}
    
    
    		public void setName (String name){
    			this.name = name;	
    		}
    
    
    		public String getSurname(){
    			return surname;	
    		}
    
    
    		public void setSurname (String surname){
    			this.surname = surname;	
    		}
    
    
    		public int getAge(){
    			return age;	
    		}
    
    
    		public void setAge (int age){
    			this.age = age;	
    		}
    
    
    
    
    	}
    
    ***                                              ***                                  ***
    
    public class Track {
    	private String name;	
    	private String nation;	
    	private int laps;
    	
    		
    		public Track(){
    			
    		} 		
    
    
    		public Track(String name, String nation, int laps){
    			setName(name);
    			setNation(nation);		
    			setLaps(laps);
    		} 
    
    
    
    
    		public String getName(){
    			return name;	
    		}
    		
    		public void setName(String name){
    			this.name = name;	
    		}
    	  	
    		public String getNation(){
    			return nation;	
    		}
    		
    		public void setNation(String nation){
    			this.nation = nation;	
    		}
    
    
    		public int getLaps(){
    			return laps;	
    		}
    		
    		public void setLaps(int laps){
    			this.laps = laps;	
    		}
    
    
    
    
    		public void announceTrack(){
    		System.out.println("Welcome to the " + name + " grandprix of " + nation + "!"); 	
    
    
                    }
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    }

  2. #2
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    361
    Quote Originariamente inviata da luca125 Visualizza il messaggio
    Guarda mi dispiace tanto per la confusione, purtroppo il problema di imparare le cose da soli � che si impara con lacune... e mi dispiace che ti sto assillando da un po' ormai
    Quanto a questo non preoccuparti, il forum è fatto apposta per chiedere chiarimenti, ci sono discussioni che vanno avanti per molto tempo ed è giusto così, al massimo la gente ci mette un po' di tempo a rispondere se ha da fare

    Curiosità mia riguardo al codice, che editor di testo o IDE usi per programmare?
    Io con Notepad++ mi trovo benissimo, è facilissimo tenere il codice ben indentato e puoi personalizzare il modo di mostrare le parole chiave in modo da non aver bisogno di separare con tanti spazi e righe vuote i vari metodi.
    Certo non è fatto apposta per compilare ed eseguire i programmi java, ma io mi trovo bene anche da linea di comando.

    Quote Originariamente inviata da luca125 Visualizza il messaggio
    Comunque il codice l'ho cambiato di nuovo alla fine, i due array erano confusionari quindi ho tolto l'array drivers e ho lasciato solamente cars, dentro il quale ho istanziato i piloti. ora il programma funziona, a parte il fatto che non stampa i nomi dei piloti, ma stampa:

    Driver@6d06d69c
    Driver@7852e922
    Driver@4e25154f
    Driver@70dea4e
    Driver@5c647e05
    Driver@33909752
    The winner is Driver@7852e922

    L'errore penso sia piccolo, ma io ormai ci sto impazzendo dietro a questo programma
    Ok bene la sistemazione di quella parte, ora ogni monoposto ha il proprio Driver come è giusto che sia.

    Per quanto riguarda l'errore in fase di stampa hai ragione, è davvero piccolo: il metodo che usi per stampare a video (System.out.println), ma anche gli altri metodi per la stampa in generale, "scrivono" un oggetto richiamando il suo metodo toString(), che è definito in Object e viene pertanto ereditato da ogni classe che crei.

    Il metodo in generale restituisce una stringa contenente nome della classe e codice hash, per cui quando si stampa un Oggetto (per i tipi primitivi e alcune classi come String questa parte non serve, il println è definito in modo specifico per ognuno di essi) devi fare l'override del metodo toString() per poter impostare la stringa che verrà stampata.
    Nel tuo caso in Driver puoi fare in modo che toString() restituisca il nome e il cognome del pilota.

    Riguardo al codice in generale, non ho guardato ogni specifico particolare, ma ti consiglio di fare anche quelle modifiche consigliate nei messaggi precedenti, in particolare di non costruire tanti oggetti Random, ora non fa una grande differenza ma è bene imparare ad usare solo quello di cui si ha bisogno.
    Poi vedo che in molti costruttori usi ancora i metodi set, in generale come dicevo i metodi set e get vengono usati solo all'esterno delle classi...
    Ultima modifica di Ansharja; 29-06-2016 a 12:05

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2016
    Messaggi
    12
    Quote Originariamente inviata da Ansharja Visualizza il messaggio
    Quanto a questo non preoccuparti, il forum è fatto apposta per chiedere chiarimenti, ci sono discussioni che vanno avanti per molto tempo ed è giusto così, al massimo la gente ci mette un po' di tempo a rispondere se ha da fare

    Curiosità mia riguardo al codice, che editor di testo o IDE usi per programmare?
    Io con Notepad++ mi trovo benissimo, è facilissimo tenere il codice ben indentato e puoi personalizzare il modo di mostrare le parole chiave in modo da non aver bisogno di separare con tanti spazi e righe vuote i vari metodi.
    Certo non è fatto apposta per compilare ed eseguire i programmi java, ma io mi trovo bene anche da linea di comando.



    Ok bene la sistemazione di quella parte, ora ogni monoposto ha il proprio Driver come è giusto che sia.

    Per quanto riguarda l'errore in fase di stampa hai ragione, è davvero piccolo: il metodo che usi per stampare a video (System.out.println), ma anche gli altri metodi per la stampa in generale, "scrivono" un oggetto richiamando il suo metodo toString(), che è definito in Object e viene pertanto ereditato da ogni classe che crei.

    Il metodo in generale restituisce una stringa contenente nome della classe e codice hash, per cui quando si stampa un Oggetto (per i tipi primitivi e alcune classi come String questa parte non serve, il println è definito in modo specifico per ognuno di essi) devi fare l'override del metodo toString() per poter impostare la stringa che verrà stampata.
    Nel tuo caso in Driver puoi fare in modo che toString() restituisca il nome e il cognome del pilota.

    Riguardo al codice in generale, non ho guardato ogni specifico particolare, ma ti consiglio di fare anche quelle modifiche consigliate nei messaggi precedenti, in particolare di non costruire tanti oggetti Random, ora non fa una grande differenza ma è bene imparare ad usare solo quello di cui si ha bisogno.
    Poi vedo che in molti costruttori usi ancora i metodi set, in generale come dicevo i metodi set e get vengono usati solo all'esterno delle classi...
    Alla fine ho risolto così il problema della stampa:
    System.out.println(cars[i].getDriver().getName() + cars[i].getDriver().getSurname());

    Cosa ne pensi?
    Appena avrò un po' di tempo poi sistemerò le cose dei costruttori che dicevi, per il momento devo scappare
    Grazie davvero tanto per il tuo tempo

  4. #4
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    361
    Quote Originariamente inviata da luca125 Visualizza il messaggio
    Alla fine ho risolto così il problema della stampa:
    System.out.println(cars[i].getDriver().getName() + cars[i].getDriver().getSurname());

    Cosa ne pensi?
    E' sicuramente un modo di risolvere la cosa, ma ridefinire toString è sicuramente il metodo migliore: in questo modo la logica viene inserita all'interno della classe Driver, che è il posto migliore per gestirla, ed è invece nascosta a tutte le classi che desiderano stampare a video un oggetto Driver.

    Infatti se devi modificare le informazioni che vuoi ricevere (ad esempio potresti voler aggiungere i punti nel mondiale, il numero di macchina del pilota o anche solo cambiare il carattere di separazione tra nome e cognome o altro...) ti basta modificare un unico metodo nella classe Driver, senza dover cambiare tutte le istruzioni relative alla stampa nelle altre classi.
    Poi migliori la leggibilità del codice e lo rendi più snello, ti basta scrivere System.out.println (cars[i].getDriver()) , senza doverti preoccupare di andare a recuperare a mano le informazioni.

    Infine il metodo è toString() è utile anche in altri contesti, per ora potrebbe non servire a tutti i costi ma non fa male abituarsi a ridefinirlo

Tag per questa discussione

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.