IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Mauvaise utilisation de l'héritage en Java ?


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 26
    Par défaut Mauvaise utilisation de l'héritage en Java ?
    Bonjour, j'ai un petit soucis avec de deux programmes : l'un constitue la classe mère(classe MonImage) et le deuxième constitue la classe fille(classe Canny).
    Mon soucis est que la classe Canny implemente un algorithme et j'ai une interface graphique dans laquelle il y a un bouton Canny, quand je clique dessus, l'algorithme de Canny doit être éxecuté sur l'image chargée mais voila dans mon cas, j'obtiens l'erreur suivante :
    HelloException in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at PI3.MonImage.conversionMatrice2(MonImage.java:99)
    at PI3.Canny.<init>(Canny.java:28)


    Voici ma classe mère et le compilateur me pointe la ligne suivante :
    int largeur = matriceNdg.getLargeur();
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
     
     
    import java.io.*;
    import java.awt.Color;
    import java.awt.image.BufferedImage;
    import javax.imageio.ImageIO;
     
     
    public class MonImage {
     
    	protected BufferedImage ImageCharger;	
    	protected Matrice matriceNdg;
     
    	public MonImage(String input) 	{
    		try	{
    				ImageCharger = ImageIO.read(new File(input));  // Lis l'image dans le buffer     				
    		}
    		catch(IOException exception) 
    		{
    			System.out.println("Lecture du fichier "+input+" impossible");
    		}	
    	}
     
    	public MonImage(Matrice test) { 
    		this.matriceNdg = new Matrice(test.getLargeur(),test.getHauteur());
    		for(int j = 0; j < matriceNdg.getHauteur(); j++) { 
    			for(int i = 0; i < matriceNdg.getLargeur(); i++) { 
    				double pixel = test.getValeur(i, j);
    				matriceNdg.setValeur(i, j, pixel);
    			}
    		}
    	}
     
            public MonImage(BufferedImage image) {
    		ImageCharger = image;
    	}	
     
    	public void dessinerImage()	{	// Cette methode dessine l'image en noir et blanc dans le buffer
     
    		for (int x= 1; x < (ImageCharger.getWidth()-1); x++) {
    			for (int y= 1; y < (ImageCharger.getHeight()-1); y++) {				
    				int gris = (int)matriceNdg.getValeur(x,y);
    				Color c = new Color(gris,gris,gris);
    				int rgb = c.getRGB();
    				ImageCharger.setRGB(x, y, rgb);
    			}
    		}
    	} 
     
     
    	public void conversionMatrice(Matrice test)	{
     
    		int nbLignes = test.getLargeur();
    		int nbCol = test.getHauteur();		
    		for ( int j = 1 ; j < nbCol -1 ; j++ )	{
    			for ( int i = 1 ; i < nbLignes - 1 ; i++) {
    				int gris = (int)test.getValeur(i,j);		
    				Color c = new Color(gris,gris,gris);
    				int rgb = c.getRGB();
    				ImageCharger.setRGB( i-1 , j-1 , rgb);
    			}
    		}
    	}
     
    	public void conversionMatrice2() {		
     
    		System.out.println("Hello");
    		int largeur = matriceNdg.getLargeur();
    		int hauteur = matriceNdg.getHauteur();
    		for (int j = 0; j < hauteur; j++)	{
    			for (int i = 0 ; i < largeur; i++) {
    				int gray = (int)matriceNdg.getValeur(i,j);
    				Color c = new Color(gray,gray,gray);
    				int rgb = c.getRGB();
    				ImageCharger.setRGB(i, j, rgb);
    			}
    		}	
    	}
     
    	public void setMatrice(Matrice test) {
    		this.matriceNdg = test;
    	}
     
    	public void sauverImage(String nom, String format)
    	{
    		try {
    			    File fic= new File(nom+ "." + format);
    			    ImageIO.write(getImage(), format, fic);
    			    System.out.println("image enregistree");
    			} 
    		catch (IOException e) {
    			    e.printStackTrace();
    			}
    		} 
    }
    Voici ma classe fille ou j'ai des appels de fonctions (je vous ai retiré les fonctions auxilaires pour faire moins gros):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    public class Canny extends MonImage {
     
    	protected int seuilBas = 70;
    	protected int seuilHaut = 140;
     
     
    	public Canny(BufferedImage im) {
    		super(im);
    		MonImage image = new MonImage(im);
    		Matrice niveauDeGris = new Matrice(image);
    		Matrice kernel = new Matrice(3, 3);
    		Matrice sobelX = new Matrice(3,3);
    		Matrice sobelY = new Matrice(3,3);
    		sobelX = sobelX.SobelX();
    		sobelY = sobelY.SobelY();	
    		kernel = kernel.filtreGaussien(1, 0.8);
    		niveauDeGris = niveauDeGris.convolution(kernel);
    		niveauDeGris.diviser(kernel);
    		Canny nouveau_niveauDeGris = new Canny(niveauDeGris);	
    		nouveau_niveauDeGris.gradient(sobelX, sobelY);
    		nouveau_niveauDeGris.seuillageContours();
    		image.conversionMatrice2();
    	}
     
    	public Canny(Matrice test) {
    		super(test);
    	}
     
    }
    Je n'arrive pas à comprendre pourquoi mon attribut matriceNdg n'est pas initialisé (d'après le compilateur bien sur) car pourtant j'ai bien un constructeur qui prend en parametre une matrice et qui la remplie. Donc si vous pouvez m'aider ou m'indiquer l'erreur que je ne vois pas, merci

  2. #2
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Avril 2010
    Messages : 394
    Par défaut
    Bonjour,

    Est-ce que c'est normal que dans le code posté ci-dessus, tu commences par faire appel à un constructeur de monImage avec un BufferedImage en paramètre, et que ce constructeur n'existe pas ?

    Mako.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 26
    Par défaut
    Oups c'était une erreur de ma part quand j'ai supprimée certaines méthodes inutiles, desolée et merci pour la remarque !

  4. #4
    Rédacteur
    Avatar de thierryler
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    4 078
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 078
    Par défaut
    marque résolu si c'est bon
    Thierry Leriche-Dessirier
    Consultant Java JEE Web Agile freelance
    Rédacteur pour Developpez
    Professeur de Génie Logiciel à l'ESIEA

    Site : http://www.icauda.com / Linked'in : http://www.linkedin.com/in/thierryler / Twitter : @ThierryLeriche

  5. #5
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Avril 2010
    Messages : 394
    Par défaut
    Bonjour,

    Ton matriceNdg est nul, car il est lié à l'instance de MonImage. Or, dans le constructeur que tu utilises pour instancié ton objet "image" (celui que tu avais oublié), tu n'instancies en réalité que le BufferedImage associé, et pas la matrice associée.

    Ainsi, lorsque tu appelles ta méthode conversionMatrice2 sur ton objet "image", c'est l'instance de la Matrice de cette image que tu essayes d'utiliser, et pas la matrice que tu as instanciée auparavant dans ton code.

    Il te faudrait soit un setter dans la classe MonImage pour l'attribut matriceNdg, soit un constructeur prenant un BufferedImage et une Matrice (par exemple).

    Mako.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 26
    Par défaut
    Ah je vois ce que tu veux dire mais je pensais que si une classe héritait de la classe MonImage et que dans cette classe, j'utilisais ma matrice de niveau de gris alors grace à l'héritage, matriceNdg ne serai pas nulle. De plus, je fais un appel au constructeur de MonImage qui remplit ma matrice mais apparament je ne le fais pas bien !

    Mais j'ai déjà utilisé un setter pour l'attribut matriceNdg, cela ne m'a as rien donné. Mais je vais tenter le coup du constructeur avec deux paramêtre !

Discussions similaires

  1. Utiliser ssh dans une application java
    Par Samanta dans le forum Sécurité
    Réponses: 12
    Dernier message: 28/02/2007, 16h30
  2. Utiliser un fichier MP3 avec Java
    Par musicg dans le forum Multimédia
    Réponses: 3
    Dernier message: 27/09/2006, 16h56
  3. Composants à utiliser pour une interface graphique Java
    Par nicolas.pied dans le forum Composants
    Réponses: 4
    Dernier message: 28/11/2005, 20h27
  4. [Windows]utiliser une dll c# en java
    Par dude666 dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 01/07/2005, 02h19
  5. [ActiveX] Peut-on utiliser un Controle ActiveX avec Java
    Par waldo2188 dans le forum Multimédia
    Réponses: 2
    Dernier message: 22/02/2005, 11h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo