Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    Programma smette di funzionare correttamente se inserisco dei Thread.sleep()

    Salve,
    ho realizzato un programma che simula un torneo. Funziona tutto correttamente ma, come si può intuire, Java esegue le istruzioni in rapida successione impedendo all'utente di seguire l'andamento delle partite man mano che evolvono... Ho quindi pensato di introdurre degli adeguati Thread.sleep(1000) o con altri valori, procedendo anche ad aggiungere i vari throws InterruptedException nei metodi che contengono queste pause, in modo che tutti i file Java si compilino regolarmente.

    Mi succede che, così facendo, si genera in esecuzione, dopo aver ricevuto correttamente l'input dell'utente:
    Exception in thread "main" java.lang.NoClassDefFoundError: Partita
    at Match.<init>(Match.java:7)
    Partita e Match sono due classi del programma, e al rigo "incriminato c'è
    codice:
    Partita set = new Partita();
    Non capisco questo problema dato che il programma, rinunciando ai Thread.sleep(), si esegue integralmente fermandosi soltanto se la squadra scelta lo vince o viene eliminata in una delle partite a eliminazione.

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da Gas75 Visualizza il messaggio
    Exception in thread "main" java.lang.NoClassDefFoundError: Partita
    at Match.<init>(Match.java:7)
    È molto strano, anche perché l'uso di Thread (il java.lang.Thread) non c'entra niente con il fatto che una classe possa non essere compilabile e/o non essere trovata dalla JVM. Verifica bene se è tutto compilato (cosa usi? IDE? JDK da prompt?).

    E comunque senza vedere il codice per intero non saprei cosa altro aggiungere.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  3. #3
    Il file Partita.class è compilato, infatti il programma si avvia fino all'istanza di Scanner inclusa, acquisisce l'input utente, fa un println() della partita che si sta per giocare e poi stampa quel messaggio.
    Faccio tutto da prompt con i comandi javac e java sul file contenente il main(), ma a volte preferisco cancellare manualmente i file .class perché javac non li sovrascrive (non è questo il caso).
    Mi fa molto strano che, se ometto tutti i Thread.sleep(), il programma funziona perfettamente, ma appunto non da tempo all'utente di seguire il torneo, ma soltanto di essere letto risalendo all'inizio degli output...

  4. #4
    Ho isolato il problema al file Partita.java: tutti gli altri Thread.sleep() funzionano, ma appena lo decommento in Partita.java, sebbene ci sia throws InterruptedException, il prompt lancia quel messaggio con quel <init>.
    codice:
    public class Partita {
    	Squadra squadraA;
    	Squadra squadraB;
    	String a;
    	String b;
    	int w;
    	boolean s;
    
    
    	public boolean giocaSet(Squadra tu, Squadra pc, String a, String b, int w) throws InterruptedException {
    		squadraA = tu;
    		squadraB = pc;
    		this.a = a;
    		this.b = b;
    		this.w = w;
    		int punteggioA = 0, punteggioB = 0;
    
    
    		while ((punteggioA < w && punteggioB < w) || (punteggioA >= w && Math.abs(punteggioB - punteggioA) < 2) || (punteggioB >= w && Math.abs(punteggioB - punteggioA) < 2)) {
    			double azione = Math.random();
    
    
    			if (azione < 0.5) {
    				punteggioA++;
    			} else {
    				punteggioB++;
    			}
    			
    			System.out.println(punteggioA + "/" + punteggioB);
    			Thread.sleep(500);
    
    
    		}
    		
    		if (punteggioA > punteggioB) {
    			s = true;
    		} else {
    			s = false;
    		}
    		
    		return s;
    	}
    
    
    }
    Strano anche che venga ignorato il catch del main()
    codice:
    public class PlayoffTest {
    
    	public static void main(String[] args) {
    		
    		Playoff playoff = new Playoff();
    
    
    		try {
    			playoff.formaSquadre();
    		} catch (Exception e) {
    			System.out.println(e.getMessage() + " Programma terminato.");
    		}
    
    
    	}
    
    
    }

  5. #5
    Ho risolto lasciando
    codice:
    Partita set;
    come dichiarazione fuori dal metodo, e creando l'istanza
    codice:
    set = new Partita();
    nel metodo che poi ne chiama i caller.

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 © 2024 vBulletin Solutions, Inc. All rights reserved.