Thread et visibilité des variables
Bonsoir
D'avance merci pour votre lecture :)
Je travaille en ce moment sur la conception d'une interface graphique.
J'ai obtenu un comportement que je ne m'explique pas. Afin de l'illustrer voici un exemple
mon main
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| import java.io.IOException;
import javax.swing.SwingUtilities;
public class Exemple {
private final static exemple_frame mes_frames[] = new exemple_frame[1];
public static void main (String [] args)throws IOException {
final int k = 0;
SwingUtilities.invokeLater(new Runnable(){
public void run(){
mes_frames[k] = new exemple_frame("Exemple 0");
mes_frames[k].setVisible(true);//On la rend visible
if (!mes_frames[k].equals(null)) {
System.out.println("je suis connu dans mon thread createur");
} else {
System.out.println("je ne suis pas connu dans mon thread createur");
}
}
});
/*if (!mes_frames[k].equals(null)) {
System.out.println("je suis connu dans le main");
} else {
System.out.println("je ne suis pas connu dans le main");
}*/
SwingUtilities.invokeLater(new Runnable(){
public void run(){
if (!mes_frames[k].equals(null)) {
System.out.println("je suis connu dans un nouveau thread");
} else {
System.out.println("je ne suis pas connu dans un nouveau thread");
}
}
});
}
} |
ma definition de JFrame
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class exemple_frame extends JFrame {
public exemple_frame(String title){
super();
build(title);//On initialise notre fenêtre
}
private void build(String title){
setTitle(title); //On donne un titre à l'application
setSize(400,240); //On donne une taille à notre fenêtre
setLocationRelativeTo(null); //On centre la fenêtre sur l'écran
setResizable(true); //On autorise la redimensionnement de la fenêtre
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //On dit à l'application de se fermer lors du clic sur la croix
}
} |
Un code pas très sorcier qui crée une JFrame et regarde ou elle est connu
Dans les 2 threads lancé aucun soucis.
J'ai le résultat attendu la variable mes_frames étant déclaré avant et déclaré static, final les deux threads l'adresse sans problème
Là ou je ne comprends plus c'est lorsque j'essaye de faire le test dans le main(en virant les commentaires), je ramasse un
Citation:
Exception in thread "main" java.lang.NullPointerException
at Exemple.main(Exemple.java:21)
8O
Merde un pointeur null mais pourtant j'ai déclaré la variable avant et initialisé aussi, non là je ne pige pas :calim2:
Merci de votre aide