Des messages d'erreurs avec mon code

Résolu
Signaler
Messages postés
292
Date d'inscription
lundi 6 novembre 2006
Statut
Membre
Dernière intervention
12 mai 2013
-
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
-
salut


voila le code qui contient des messages d'erreurs et je ne sais plus comment les enlever pour que le code ça foctionne


package aa;
import java.util.ArrayList;

class thread1
 {

 publicstaticArrayList methode(){
ArrayList A = newArrayList();
ArrayList B = newArrayList();
Thread m1_IOThread ;
Thread ATTEND;

       
m1_IOThread = newThread(){
 
publicvoid run(){
             try{
              A.add("ulysse00");
        }
             catch(Exception ex){
               System.out.println(ex);
             }
         
           }

         };
         m1_IOThread.setPriority(Thread.MIN_PRIORITY);
         m1_IOThread.start();
     
         ATTEND = newThread(){
                                  publicvoid run(){
                                 
                               
                                    while(m1_IOThread != null)
                                            {
                                      try{
                                        this.sleep(100);
                                      }
                                      catch(Exception G){}
                                    }
                                    B.add(A);
                                  }
     
         };
         ATTEND.setPriority(Thread.MIN_PRIORITY);
         ATTEND.start();

     return(B);
   }
 }

les messages d'erreurs sont
"thread1.java": local variable A is accessed from within inner class; needs to be declared final at line 19, column 15
"thread1.java": local variable m1_IOThread is accessed from within inner class; needs to be declared final at line 35, column 44
"thread1.java": local variable B is accessed from within inner class; needs to be declared final at line 42, column 37

sur la lignes
A.add("ulysse00");
et
B.add(A);

et la ligne while (m1_IOThread != null )

merci de bien vouloir m'aider
A voir également:

19 réponses

Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
37
Salut:

Tu t'en sors bien, Félicitations.

Tu as commpis une petite faute d'inattention:

Changes while (ta.isAlive () && tb.isAlive ());

Par while (ta.isAlive () || tb.isAlive ());

J'espère que tu as compris pourquoi; Tantque le thread ta ou le thread tb sont en cours d'exécution alors on doit rester bloquer sur cette boucle.

Lorsque tu appelles la méthode start () alors tu es sûr que les threads sont en cours d'exécutions parallèlement avec le thread principal (main).
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
37
Salut:

Première remarque: Tu ne respectes pas la convention de nommage en Java.
"La première lettre du nom d'une variable doit être en minuscule".
Crois moi, ça aide beaucoup à lire aisément un code.

Pour ton problème, je pense que déja le compilateur t'a signalé ce qu'il faut faire.
"Il faut ajouter le modificateur final à la déclaration de tes variables locales".

allinurl%3AArrayList+java.sun.com&bntl=1 final ArrayList A = newallinurl%3AArrayList+java.sun.com&bntl=1 ArrayList();
final ArrayList B = newArrayList();
final Thread m1_IOThread ;




Proposition:
Si ces variables locales étaient par exemple des attributs de ta classe, pas de problème; ils sont belle et bien visibles au niveau des classes innées.
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
37
Salut:

Autre chose à dire, qui explique bien la cause de cette error de compilation.

Les variables locales sont créées dans la pile d'exécution de la méthode correspondantes.(Heap)

Par contre les attributs, ou les variables déclarées en tantque final sont allouées dans la pile d'exécution du tout le programme qui est le plus général et le plus global. (Tas)

J'espère avoir était clair (ICA).
Messages postés
292
Date d'inscription
lundi 6 novembre 2006
Statut
Membre
Dernière intervention
12 mai 2013
1
merci pour cette information j'ai modifier le code mais ça marche pas
voila le code 

 
package aa;
import java.util.ArrayList;
 
class thread1
 {
 
 publicstaticArrayList methode(){
finalArrayList A = newArrayList();
finalArrayList B = newArrayList();
finalThread m1_IOThread ;
Thread ATTEND;
 
 
 
m1_IOThread = newThread(){
 
publicvoid run(){
             try{
              A=calcule.methode();
               System.out.println(A);
        }
             catch(Exception ex){
               System.out.println(ex);
             }
 
           }
 
         };
         m1_IOThread.setPriority(Thread.MIN_PRIORITY);
         m1_IOThread.start();
 
         ATTEND = newThread(){
                                  publicvoid run(){
 
 
                                    while(m1_IOThread != null)
                                            {
                                      try{
                                        this.sleep(100);
                                      }
                                      catch(Exception G){}
                                    }
 
                                    B.add(A);
System.out.println(B);
                                  }
 
         };
         ATTEND.setPriority(Thread.MIN_PRIORITY);
         ATTEND.start();
 
     return(B);
   }
 }

un message d'erreur :"thread1.java": cannot assign a value to final variable A at line 19, column 11

sur la ligne A=calcule.methode();

aidez moi
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
37
Salut:

C'est logique, tu es en train d'affecter une nouvelle valeur à une variable constante qui a déja réçu une valeur.

final ArrayList A = new ArrayList (); // CECI EST LA PREMIERE AFFECTATION, OK

A = calcule.methode (); // CECI EST LA DEUXIEME AFFECTATION, ERREUR C'EST UNE VARIABLE CONSTANTE (final)

Pourquoi ne pas rendre ces variables en tantque attributs de ta classe de cette façon ils deviendront visibles et tu n'as pas à utiliser le modificateur final.

class ThreadExample {
    private ArrayList a = new ArrayList ();
    private ArrayList b = new ArrayList ();
    private Thread thread;

    public method () {
       thread = new Thread () {
          public void run () {
             // ...
          }
       };
    }
}
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
37
Salut:

Il y a une autre solution qui consiste à garder ces variables en tantque variables locales si tu ne veux pas les rendre des attributs de ta classe.

public class ThreadExample {
    public void method () {
       final ArrayList a = new ArrayList ();
      
final ArrayList b = new ArrayList ();
       final Thread thread = new Thread () {
          public void run () {
             // ...
             ArrayList temporary = calcule.methode ();
            
             a.clear ();
             for (int i = 0; i <
temporary
.size (); ++i) {
                a.add (
temporary
.get (i));
             }
            
             // ...
          }
       };

    }
}



Dans cette solution on ne change pas la référence dans la variable "a" mais on copie les valeurs d'un ArrayList à un autre.

Bonne chance ...
Messages postés
292
Date d'inscription
lundi 6 novembre 2006
Statut
Membre
Dernière intervention
12 mai 2013
1
salut merci encore
salut
je voulais bien utiliser les threads
de cette façons

class thread
{
public static ArrayList methode() {

thread1 qui fait ArrayList A = calcule1.methode();
thread2 qui fait ArrayList B=calcule.methode();
les deux thread exicute en paralle
puis
thread3 qui fait
while (thread1 !=null &&)
{
try {
this.sleep(100);
}
catch (Exception G) {}
}
}
ArrayList C =new Arraylist();
C.add(A);
C.add(B);

return(C)
}
}

j'ai besoin de ça c'est urgent
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
37
Salut Ulysse:

Si j'ai bien compris ta problématique, tu veux exécuter deux threads en paraléles pour remplir les deux ArrayList A et B un fois ceci est terminé, on créer un troisième ArrayList C qui est la fusion de ces deux ArrayList.

ça semble à un programme producteur/consommateur.

Je vais essayer pour te trouver une solution (ICA).

Bye ...
Messages postés
292
Date d'inscription
lundi 6 novembre 2006
Statut
Membre
Dernière intervention
12 mai 2013
1
merci encore ami , mais je voulais retourner return(C) car je vais l'utiliser dans une autre classe
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
37
Salut:

Peux tu me montrer exactement la façon avec laquelle tu remplis A et B?
C'est indispensable de savoir ça?

Je veux voir une petite trace d'exécution ou un exemple illustratif, ça permet ou moins de savoir ce qu'il faut faire.
Messages postés
292
Date d'inscription
lundi 6 novembre 2006
Statut
Membre
Dernière intervention
12 mai 2013
1
ami je coince encore et je voulais bien que tu m'aide
voila
A = calcule1.methode();
B = calcule1.methode();

et C.add(A);
C.add(B);
pouis
lareturne(C);

comme l(exemple
package aa;
import java.util.ArrayList;
 
class thread1
 {
 
 publicstaticArrayList methode(){
finalArrayList A = newArrayList();
finalArrayList B = newArrayList();
finalThread m1_IOThread ;
Thread ATTEND;
 
 
 
m1_IOThread = newThread(){
 
publicvoid run(){
             try{
              A=calcule.methode();
               System.out.println(A);
        }
             catch(Exception ex){
               System.out.println(ex);
             }
 
           }
 
         };
         m1_IOThread.setPriority(Thread.MIN_PRIORITY);
         m1_IOThread.start();
 
         ATTEND = newThread(){
                                  publicvoid run(){
 
 
                                    while(m1_IOThread != null)
                                            {
                                      try{
                                        this.sleep(100);
                                      }
                                      catch(Exception G){}
                                    }
 
                                    B.add(A);
System.out.println(B);
                                  }
 
         };
         ATTEND.setPriority(Thread.MIN_PRIORITY);
         ATTEND.start();
 
     return(B);
   }
 }
Messages postés
292
Date d'inscription
lundi 6 novembre 2006
Statut
Membre
Dernière intervention
12 mai 2013
1
 merci encore mes voila le code qui fonctionne mais je voulais confirmer si c'est just

package aa;
 
 
import java.util.ArrayList;
import java.util.Iterator;
 
 
class ThreadA extends Thread {
 
ArrayList A = new ArrayList ();
          public ArrayList getResultat(){
          A.add("ulysse");
          A.add("ulysse1");
             return(A);
           }
 
           publicvoid run(){
                    {
                      
                      Iterator IT = A.iterator();
                 while(IT.hasNext()){
                A.add(IT.next());
                                                }
 
                   }
           }
   }
 
   class ThreadB extends Thread {
 
     ArrayList B = new ArrayList ();
     public ArrayList getResultat(){
     B.add("ulysse3");
        return(B);
      }
 
      publicvoid run()
               {
 
                 Iterator IT = B.iterator();
            while(IT.hasNext()){
           B.add(IT.next());
           }
 
                  
           }
   }
 
 
publicclass  thread1 {
 
        publicstatic ArrayList calculParallele(){
                ArrayList C = new ArrayList();
                ThreadA ta = new ThreadA();
                ThreadB tb = new ThreadB();
 
                ta.start();
                tb.start();
 
                while(ta.isAlive() && tb.isAlive()){
                        try{
                                // on attend 100ms avant de retester
                                Thread.sleep(100);
                        }catch(InterruptedException e){
                                // on ne fait rien
                        }
                }
               
            
                Iterator IT = ta.getResultat().iterator();
     
                                 while(IT.hasNext()){
                                 C.add(IT.next());
                                     }
     
                                IT = tb.getResultat().iterator();
                                while(IT.hasNext()){
                                C.add(IT.next());
                                     }
 
                return(C);
        }
 
       
}
     
  j'ai doute avec run() de ThreadA et ThreadB est ce que c'est just

et est ce que les deux threadA et B fonctionne en parallele 
    
 
 
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
37
Salut:

Vaut miex mettre les sleep () dans les boucles de la méthode run que de faire ceci dans la boucle de blocage.

final ArrayList<String> arrayA = new ArrayList<String> ();
Thread ta = new Thread () {
   public void run () {
      int i = 0;
      while ( i < 10 ) {
         arrayA.add ("quelque chose");
         ++i;
         System.out.println ("Ici Thread 1 ...");
      }
   }
}; 

final ArrayList<String> arrayB = new ArrayList<String> ();
Thread tb = new Thread () {
   public void run () {
      int i = 0;
      while ( i < 20) {
         arrayB.add ("quelque chose");
         ++i;
         System.out.println ("Ici Thread 2 ...");
      }
   }
}; 

ta.start ();
tb.start ();

while (ta.isAlive () || tb.isAlive ()) {
   System.out.println ("Nous somme tous les deux bloqués ...");
}

System.out.println ("Enfin nous sommes libres ...");

// Le reste ...

Bye ...
Messages postés
292
Date d'inscription
lundi 6 novembre 2006
Statut
Membre
Dernière intervention
12 mai 2013
1
salut ami merci pour la remarque .
mais j'ai encore soucis avec chaque thread a et b
par exemple
class ThreadA extends Thread {   ArrayList A = new ArrayList ();
          public ArrayList getResultat(){
          A.add("ulysse");
          A.add("ulysse1");
             return(A);
           }
 
           publicvoid run(){
                    {
                       
                   je voulais mettre quelque chose dans run mais je ne sais pas quoi je mettre  
                   }
           }
   }
et en plus je voulais rie toucher je garde cette partie
public ArrayList getResultat(){
          A.add("ulysse");
          A.add("ulysse1");
             return(A);
           }
modifier just run
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
37
Salut:

Je commence à ne pas comprendre ce que tu veux faire.
Dire Thread c'est dire la méthode run () si tu ne vas pas mettre du code dans cette méthode alors pourquoi utiliser les threads c'est inutile.

Bye ...
Messages postés
292
Date d'inscription
lundi 6 novembre 2006
Statut
Membre
Dernière intervention
12 mai 2013
1
bonsoir
est ce que il y a une autre méthodes dans run de mes threads car  je ne sais pas quoi mettre dans run de chaque thread a et b j'ai doute avec run de thread a et b
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
37
Salut:

Avec les nouveaux changements que tu as ajouté à la source, franchement, je ne vois pas qu'elle est l'utilité d'utilier les threads maintenant.

On utilise généralement les threads pour faire reposer le thread principal des tâches lourdes et bloquantes.

Ici, ce n'est pas le cas.
Si tu étais en train de ceuillir les données à partir des fichiers ça serait vital.

Bye ...
Messages postés
292
Date d'inscription
lundi 6 novembre 2006
Statut
Membre
Dernière intervention
12 mai 2013
1
merci ami j'ai bien compris les threads et j''ai résolu mon probleme merci encore
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
37
Salut:

J'étais très occupé.

Je pense que tu dois valider aussi une tes réponses, je n'ai corrigé qu'une petite erreur de frappe.

Cordialement ...