Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 01/03/2017, à 18:58

plouf1221

Erreur java d'un débutant [RESOLU]

Bonsoir,

J'apprends le java depuis peu et je suis un débutant dans ce langage.
Je ne comprends pas le message d'erreur.
L'erreur est dans la classe de test lorsque je veux créer un Cercle.
Un coup de main svp.

Mon code :

package objetsMembre;

public class Point {
	
	private int x, y;
	
	public Point (int x, int y) {
		this.x = x;
		this.y = y; 
	}
	
	public void affiche () {
		System.out.println("centre de coodonnees : "+x+" "+y);
	}

	public int getX() {
		return x;
	}

	public void setX(int x) {
		this.x = x;
	}

	public int getY() {
		return y;
	}

	public void setY(int y) {
		this.y = y;
	}
	
	class Cercle {
		
		private int c;
		private float r; 
		
		public Cercle (int x, int y, float r) {
			Point c = new Point(x,y);
			this.r = r;
		}
			
		public void affiche () {
			System.out.println("Je suis un cercle de rayon r "+r+" et de centre de coordonnees");
			System.out.println(" "+getX()+" "+getY());
		}
		
		public void deplace (int dx, int dy) {
			setX(getX()+dx);
			setY(getY()+dy);
		}
	}

}

Ma classe de test :

package objetsMembre;

import objetsMembre.Point.Cercle;

public class test {
	
	public static void main(String[] args) {
		Point p;
		p = new Point (5,3);
		p.affiche();
		Cercle c =  new Cercle (1, 5, 1.2f); // ERREUR
		c.affiche(); 
		
	}

}

Dernière modification par plouf1221 (Le 02/03/2017, à 12:51)

Hors ligne

#2 Le 01/03/2017, à 23:40

grigouille

Re : Erreur java d'un débutant [RESOLU]

Je ne suis pas certain de comprendre ton code mais voici une version modifiée qui fonctionne

$ cat objetsMembre/Point.java 
package objetsMembre;

public class Point {
	
	private int x, y;
	public Cercle c;
	
	public Point (int x, int y) {
		this.x = x;
		this.y = y; 
	}
	
	public void affiche () {
		System.out.println("centre de coodonnees : "+x+" "+y);
	}

	public int getX() {
		return x;
	}

	public void setX(int x) {
		this.x = x;
	}

	public int getY() {
		return y;
	}

	public void setY(int y) {
		this.y = y;
	}

	public void makeCercle(float r) {c = new Cercle(r);}
	
	class Cercle {
		
		private float r; 
		
		public Cercle (float r) {
			this.r = r;
		}
			
		public void affiche () {
			System.out.println("Je suis un cercle de rayon r "+r+" et de centre de coordonnees");
			System.out.println(" "+getX()+" "+getY());
		}
		
		public void deplace (int dx, int dy) {
			setX(getX()+dx);
			setY(getY()+dy);
		}
	}
}
$ cat objetsMembre/test.java 

package objetsMembre;

public class test {
	
	public static void main(String[] args) {
		Point p;
		p = new Point (5,3);
		p.affiche();
		p.makeCercle(1.2f);
		p.c.affiche(); 
		
	}
}
$ javac objetsMembre/*.java
$ java objetsMembre.test 
centre de coodonnees : 5 3
Je suis un cercle de rayon r 1.2 et de centre de coordonnees
 5 3

Debian (xfce) 12
HP LaserJet M1132 MFP

Hors ligne

#3 Le 02/03/2017, à 00:18

soshy

Re : Erreur java d'un débutant [RESOLU]

Ca a beau etre mon métier, voir des choses atypique comme ça me fait encore découvrir des choses sur Java yikes

Alors pour débloquer ton erreur de compilation il faut légèrement modifier ta ligne par :

Cercle c =  p.new Cercle (1, 5, 1.2f); // ceci est hautement atypique! J'avais encore jamais vu. 

Après, dans la vrai vie, tu devrais :
- Avoir un fichier par classe (donc 2 fichiers différents : Point et Cercle)
- Une classe commence toujours (par convention) avec une majuscule.

public class test {

doit etre

public class Test {

En procédant avec un fichier par classe, le code de ta classe test fonctionne. Et c'est effectivement comme ça qu'il faudrait faire (et pas utiliser la premiere solution, qui n'est qu'a titre indicatif). En revanche tu as une erreur dans le constructeur de Cercle. Tu y crées un point, qui disparait aussi tot.

private int c;
private float r; 
		
public Cercle (int x, int y, float r) {
	Point c = new Point(x,y);
	this.r = r;
}

devrait etre

private Point c;
private float r; 
		
public Cercle (int x, int y, float r) {
	this.c = new Point(x,y);
	this.r = r;
}

Dernière modification par soshy (Le 02/03/2017, à 00:24)

Hors ligne

#4 Le 02/03/2017, à 10:24

plouf1221

Re : Erreur java d'un débutant [RESOLU]

J'apprends avec un livre c'est java 9ieme edition de C.Delannoy.
Et je suis au chapitre des classes internes et des interaction entre les classes.
Voila pourquoi exceptionnellement je n'ai pas mis une classe par fichier.

J'ai fais les corrections (int c --> Point c) et (r --->this.r).
Le tout dans un seul fichier et j'ai toujours la même erreur qui est : No enclosing instance of type Point is accessible. Must qualify the allocation with an enclosing
que je ne comprends toujours pas.

J'ai essayé de mettre la  classe cercle dans un fichier particuliers mais cela me donne des erreurs au niveaux des GET-machin et des SET-machin.
Erreur que je ne comprends pas non plus puisque c'est méthode sont en public.
Il faudrai peut être faire un import mais eclipse ne me le propose pas, et je ne sais pas faire un import manuellement.

Hors ligne

#5 Le 02/03/2017, à 11:24

soshy

Re : Erreur java d'un débutant [RESOLU]

As-tu déjà vu le mot clé static ?

Ce que toi tu as, en gros c'est:

public class Point {
    class Cercle {
    }
}

Ta classe cercle est accessible uniquement depuis une instance de Point.
Donc pour appeler le constructeur de Cercle, il faut l'appeler depuis une instance de Point. Donc:

Point p = new Point(...);
p.new Cercle(...);

Il y a en java une façon de rendre les éléments d'une classe accessible, sans en créer d'instance. C'est le mot clé static.

Par exemple, si tu fait

public class Point {
    public static String s = "une string";
}

au lieu de normalement faire

Point p = new Point();
System.out.println(p.s);

tu peux directement accéder a la variable comme ça:

System.out.println(Point.s);

Du coup, si tu déclares ta classe Cercle static, ton main est bon aussi. C'est quasiment équivalent à la création du fichier spécifique pour Cercle.

Maintenant, tu vas te retrouver avec le même problème pour tes getter et setters qu'avec une classe distincte. Pourquoi ?
Un élément static sera partagé par toutes les instances d'une même classe. Ca veut dire que ta classe Cercle c'est la même pour toutes les instances de Point.

Point a = new Point(...);
Point b = new Point(...);
Cercle c = new Cercle(a, 3);

(ici je suppose l'existence d'un constructeur Cercle (Point centre, int rayon) )
maintenant, si je veux faire c.affiche() on va faire getX(). Oui très bien, mais getX de quoi ? Tu ne lui a pas dis sur quel instance de l'objet point (a ? b ? autre chose ?) il doit faire le getX(). Donc là il est tout perdu. Tu veux faire getX sur

private Point c;

Il faut donc écrire c.getX()
Pareil pour les autres set et get.

Si tu veux le code complet parce que mes explications sont pas claire demande tongue

Dernière modification par soshy (Le 02/03/2017, à 11:36)

Hors ligne

#6 Le 02/03/2017, à 12:30

plouf1221

Re : Erreur java d'un débutant [RESOLU]

J'ai compris tes explications et est corrigé mon  code.
Une seule chose me dérange.

Pour corriger mon code j'ai juste fait la chose suivante :

Cercle c = p.new Cercle (1, 2, 1,2f);

Ce qui me permet d'instancier mon Cercle  mais ...

public static void main(String[] args) {
		Point p = new Point (15,20);
		p.affiche();
		Cercle c =  p.new Cercle (1, 2, 1.2f);
		c.affiche();
		p.affiche();
	}

Le résultat est le suivant :

centre de coodonnees : 15 20
Je suis un cercle de rayon r 1.2 et de centre de coordonnees
 15 20
centre de coodonnees : 15 20

Le cercle ainsi crée ne prends pas les paramètres que je lui donne (1,2) mais prends les coordonnées de p.
Autrement dit les deux premiers paramétres que je passe au constructeur Cercle ne sert plus a rien.

Quand a la solution static, je ne veux pas avoir un seul Cercle pour chaque instance de Point.

Hors ligne

#7 Le 02/03/2017, à 12:42

plouf1221

Re : Erreur java d'un débutant [RESOLU]

Soshy j'ai trouvé !
Et c'est grâce à tes explications ! Merci merci !!!!!!
En faite les classes ne sont pas imbriquées elles sont disjointes, c'est a dire les unes après les autre.
Mon code ci dessous

La classe Point + Cercle !

package objetsMembre;

public class Point {
	
	private int x, y;
	
	public Point (int x, int y) {
		this.x = x;
		this.y = y; 
	}
	
	public void affiche () {
		System.out.println("centre de coodonnees : "+x+" "+y);
	}

	public int getX() {
		return x;
	}

	public void setX(int x) {
		this.x = x;
	}

	public int getY() {
		return y;
	}

	public void setY(int y) {
		this.y = y;
	}

}
	
	class Cercle {
		
		private Point c;
		private float r; 
		
		public Cercle (int x, int y, float r) {
			this.c = new Point(x,y);
			this.r = r;
		}
			
		public void affiche () {
			System.out.println("Je suis un cercle de rayon r "+r+" et de centre de coordonnees");
			System.out.println(" "+c.getX()+" "+c.getY());
		}
		
		public void deplace (int dx, int dy) {
			c.setX(c.getX()+dx);
			c.setY(c.getY()+dy);
		}
	}

Et la classe de test :

package objetsMembre;

public class test {

	public static void main(String[] args) {
		Point p = new Point (15,20);
		p.affiche();
		Cercle c =  new Cercle (1, 2, 1.2f);
		c.affiche();
		p.affiche();
	}

}

Tout marche nickel !

Le résultat est :
centre de coodonnees : 15 20
Je suis un cercle de rayon r 1.2 et de centre de coordonnees
1 2
centre de coodonnees : 15 20

Dernière modification par plouf1221 (Le 02/03/2017, à 12:44)

Hors ligne

#8 Le 02/03/2017, à 12:44

soshy

Re : Erreur java d'un débutant [RESOLU]

Poste te code complet, mais je soupçonne que tu as laissé "getX()" au lieu de mettre c.getX() dans la fonction affiche de la classe Cercle.

Tu as mal compris le static. C'est correcte dans le cas d'une fonction ou d'un attribut de classe. En revanche pour une classe, le static te donne une seule classe Cercle accessible sans avoir à instancier de classe Point préalablement. Tu peux en revanche instancier ta classe static Cercle (new Cercle(...); ) autant de fois que tu veux, ce qui te donnera autant d'instances différentes d'une même classe.

Dernière modification par soshy (Le 02/03/2017, à 12:48)

Hors ligne

#9 Le 02/03/2017, à 12:47

plouf1221

Re : Erreur java d'un débutant [RESOLU]

Le code est complet.
Mais si je faits un static sur le cercle j'airai un seul cercle pour toutes les instances d'objet, c'est toi qui la dit :

soshy a écrit :

Un élément static sera partagé par toutes les instances d'une même classe.

J'attends que tu me confirmes que le code est complet pour mettre résolu.

Dernière modification par plouf1221 (Le 02/03/2017, à 12:49)

Hors ligne

#10 Le 02/03/2017, à 12:49

soshy

Re : Erreur java d'un débutant [RESOLU]

Oui, voir ma reformulation smile

Hors ligne

#11 Le 02/03/2017, à 12:55

soshy

Re : Erreur java d'un débutant [RESOLU]

Ca c'est la bonne façon de faire si tu veux comparer:

public class Point {
	
	private int x, y;
	
	public Point (int x, int y) {
		this.x = x;
		this.y = y; 
	}
	
	public void affiche () {
		System.out.println("centre de coodonnees : "+x+" "+y);
	}

	public int getX() {
		return x;
	}

	public void setX(int x) {
		this.x = x;
	}

	public int getY() {
		return y;
	}

	public void setY(int y) {
		this.y = y;
	}
	
	static class Cercle {
		
		private Point c;
		private float r; 
		
		public Cercle (int x, int y, float r) {
			this.c = new Point(x,y);
			this.r = r;
		}
			
		public void affiche () {
			System.out.println("Je suis un cercle de rayon r "+r+" et de centre de coordonnees");
			System.out.println(" "+c.getX()+" "+c.getY());
		}
		
		public void deplace (int dx, int dy) {
			c.setX(c.getX()+dx);
			c.setY(c.getY()+dy);
		}
	}
}

Dernière modification par soshy (Le 02/03/2017, à 12:56)

Hors ligne