Se connecter avec
S'enregistrer | Connectez-vous

Objet bien initialisé et pourtant null ! (JAVA)

Dernière réponse : dans Programmation

Bonjour !

Depuis hier je me démène avec un problème que je n'arrive pas à résoudre :
Ayant voulu utiliser une simple JComboBox, je me retrouve avec une NullPointerException dès que j'ajoute un objet String dans celle-ci . Après quelques recherches, en utilisant le mode debug, je me suis rendu compte que l'objet qui contenait la JComboBox était null... Voici le schéma de mon projet pour être claire :

  1. class Fenetre extends JFrame{
  2.  
  3. ...
  4. Ecouteur e; // Objet controleur qui contient les Listeners
  5. IconesDessin icones; // IconesDessin étant une classe héritée de JToolBar
  6.  
  7. public Fenetre(){
  8.  
  9. icones = new IconesDessin(e);
  10.  
  11. ...
  12. }
  13.  
  14. public IconesDessin getIcones(){
  15. return icones;
  16. }
  17. }



Donc, c'est l'objet icones qui contient la JComboBox; comme vous pouvez le voir j'initialise l'objet ! Et pourtant en utilisant le mode debug, et en faisant ctrl+shift+i, je vois que l'objet est null. Paradoxalement, je n'avais jamais eu de problème avec cet objet là jusque là, il marchait parfaitement et aucune exception n'était levée ; mais, depuis que j'ai voulu récupérer ma JComboBox dans un ActionListener, l'exception est levée ; comme un code vaut mieux que milles explications ! :

  1. class IconesDessin{
  2.  
  3. JComboBox choixTaille;
  4.  
  5. public IconesDessin(Ecouteur e){
  6. choixTaille = new JComboBox();
  7. choixTaille.setActionCommand("Taille");
  8. choixTaille.addActionListener(e);
  9. choixTaille.addItem("Taille");
  10. choixTaille.addItem("Grand");
  11.  
  12. }
  13.  
  14. public JComboBox getChoixTaille(){
  15. return choixTaille;
  16. }
  17. }
  18.  
  19. class Ecouteurs implements ActionListener{
  20.  
  21. Fenetre fenetre;
  22. int taille;
  23. ...
  24. public Ecouteurs(Fenetre f){
  25. this.fenetre = f;
  26. this.taille = 50;
  27. }
  28.  
  29.  
  30.  
  31. public void actionPerformed(ActionEvent e){
  32.  
  33.  
  34. if(e.getActionCommand().equals("Pinceau")){
  35. if(clicPinceau == 0){
  36. fenetre.getIcones().getOutilsPinceau().setVisible(true); // Ici, fenetre.getIcones() invoquée ==> pas de problème, pas de NullPointerException
  37. clicPinceau++;
  38.  
  39. if(debug) System.out.println("Outil pinceau affiché");
  40. }
  41.  
  42. else{
  43. fenetre.getIcones().getOutilsPinceau().setVisible(false); // Idem ici
  44. clicPinceau = 0;
  45.  
  46. if(debug) System.out.println("Outil pinceau caché");
  47. }
  48. fenetre.repaint();
  49. }
  50.  
  51. else if(e.getActionCommand().equals("Formes")){
  52. if(clicFormes == 0){
  53. fenetre.getIcones().getOutilsFormes().setVisible(true); // Idem ici
  54. clicFormes++;
  55.  
  56. if(debug) System.out.println("Outil formes affiché");
  57. }
  58.  
  59. else{
  60. fenetre.getIcones().getOutilsFormes().setVisible(false); // Idem ici
  61. clicFormes = 0;
  62.  
  63. if(debug) System.out.println("Outil formes caché");
  64. }
  65.  
  66. fenetre.repaint();
  67. }
  68.  
  69. else if(e.getActionCommand().equals("Taille")){
  70.  
  71. if(fenetre.getIcones().getChoixTaille().getSelectedItem().equals("Grand")){ // Exception levée à cette ligne-ci
  72. taille = 50;
  73. }
  74.  
  75. }
  76. }


  1. Exception in thread "main" java.lang.NullPointerException
  2. at controleur.Ecouteurs.actionPerformed(Ecouteurs.java:139)
  3. at javax.swing.JComboBox.fireActionEvent(Unknown Source)
  4. at javax.swing.JComboBox.contentsChanged(Unknown Source)
  5. at javax.swing.AbstractListModel.fireContentsChanged(Unknown Source)
  6. at javax.swing.DefaultComboBoxModel.setSelectedItem(Unknown Source)
  7. at javax.swing.DefaultComboBoxModel.addElement(Unknown Source)
  8. at javax.swing.JComboBox.addItem(Unknown Source)
  9. at vue.IconesDessin.<init>(IconesDessin.java:76)
  10. at vue.Fenetre.<init>(Fenetre.java:45)
  11. at main.Main.main(Main.java:29)


Je ne comprends donc pas :
- pourquoi mon objet icones est null alors que je l'initialise correctement
- pourquoi cela ne crée de problème qu'avec une seule invocation de la méthode fenetre.getIcones(); le problème viendrait-il spécifiquement de getChoixTaille() ?
Merci d'avance pour votre aide, j'espère qu'on va pouvoir solutionner ça , je cherche depuis deux jours en vain ! :( 
Lassé par la pub ? Créez un compte
Expert Programmation

Salut,

Dans l'erreur que tu as, rien ne te dit que c'est l'objet icones qui est null.
Ca peut être très bien être le JComboBox ou le SelectedItem du JComboBox qui est null ;) 
Expert Programmation

bah est-ce que le SelectedItem est bien non null ?
Essaie de diviser le tout:
  1. IconesDessin icones = fenetre.getIcones();
  2. JComboBox choixTaille = icones.getChoixTaille();
  3. string selectedItem = choixTaille.getSelectedItem();
  4. if(selectedItem.equals("Grand" )){ // Exception levée à cette ligne-ci
  5. taille = 50;
  6. }


Et comme ça, si ça plante, tu verras à quel endroit... (hmm, j'ai mis le selectedItem en type string, mais je suis pas sûr que ce soit le cas, je te laisse arranger ça)

Bonsoir,
J'ai fait ce que tu m'as dis et l'exception est levée sur choixTaille ; le problème est que j'ai envie de dire "et maintenant?" parce que je ne vois sincerement pas d'où vient le probleme...

Exception in thread "main" java.lang.NullPointerException
at controleur.Ecouteurs.<init>(Ecouteurs.java:86)
at vue.Fenetre.<init>(Fenetre.java:34)
at main.Main.main(Main.java:29)

Je n'arrête pas de vérifier encore et encore si la méthode est correcte et si j'ai initialisé l'objet, et la réponse et oui ! Que faire?
Expert Programmation

Bah tout ce que je peux te dire, maintenant c'est que l'objet est null, c'est qu'il y a quelque chose qui ne passe pas dans ton initialisation.
Avec le code que tu as fourni, c'est difficile de dire quoi, mais ton objet est null, donc il n'est pas initialisé.
Lassé par la pub ? Créez un compte
  • Contenus similaires :
Tags :
Tom's guide dans le monde