Méthode de type de retour String

Fermé
Akrouti Ezzeddin Messages postés 50 Date d'inscription samedi 26 novembre 2011 Statut Membre Dernière intervention 31 mai 2012 - 5 mai 2012 à 02:44
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 5 mai 2012 à 04:53
Bonjour,
Voila le code ou est l'erreur s'il vous plait.
	public String durationSession() throws ParseException
	{
		
		final String date=(String)this.determinerDate();
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		final Date d1 = format.parse(date);
		String dur="";
		
	    
	    int delay = 1000; // Première exécution dans 5 secondes
	       int period = 1000; // Répéter pour 1 min
	       final Timer timer = new Timer(); 
	       timer.scheduleAtFixedRate(
	               new TimerTask() 
	               {public void run()  { try {
	            	   Session s=new Session();
	            	   Date d0 = null;
	            	   SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	            	   String date1=(String)s.determinerDate();
	            		   d0 =  format.parse(date1);
	            		   long hoursDifference = ((d0.getTime() - d1.getTime()));
	            		   int secondes=(int) (hoursDifference/1000);
	            		   int minutes=secondes/60;
	            		   int heures=secondes/3600;
	            		   int secrestes=secondes%60;
	            		   dur= heures+":"+minutes+":"+secrestes;
	            		   
	            	   }catch(Exception e)
	            	   {e.printStackTrace();
	            		   }
	            	   }
	               
	    
	},delay, period);
	       return dur;

	
	}




Le code Erreur:
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
Cannot refer to a non-final variable dur inside an inner class defined in a different method

at client.Session.durationSession(Session.java:330)
at client.Session.main(Session.java:414)


1 réponse

KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
5 mai 2012 à 04:53
Tu ne peux pas modifier ta variable "dur" à l'intérieur de la classe TimerTask, car pour y faire référence elle doit être déclaré "final" comme le sont d'ailleurs les autres.
Cependant avec un String tu ne vas pas t'en sortir car il est immuable, c'est à dire qu'il est impossible de modifier le contenu de la String sans changer sa référence...

Une solution pourrait être d'utiliser un StringBuffer :

final StringBuffer dur = new StringBuffer();
// ...
dur.replace(0,replace.length(), heures+":"+minutes+":"+secrestes);
// ...
return dur.toString();

Remarque :
Je ne sais pas ce que tu veux faire, mais a priori le return, va renvoyer une chaîne vide, puisque la méthode run() qui lui donne sa valeur, ne sera appelé que plus tard...
0