Flux rss
Rechercher : dans
Par : Pertinence Date Nom d'utilisateur
Statut : Non résolu

Demande d'explication sur un problème java

mathyass, le lundi 7 juillet 2008 à 22:17:40
Tout d'abord bonjour à tous!

J'aimerai vous poser deux questions si quelqu'un pouvait m'éclairer:


Tout d'abord j'aimerai savoir si il est possible ou non d'appeller un vector encapsulé dans une classe dans un main et si oui comment

Voici ma classe qui crée le vector:



import java.util.*;
public class Queue {

private Vector <String> queue;


public Queue() {

queue = new Vector();

}

public synchronized void ecrit(String message) {

queue.add(message);
taille();
notify();
}

public synchronized String lit() {

boolean fini = false;
while (queue.isEmpty() && !fini)
try
{wait();}
catch (InterruptedException e1)
{System.out.println ("la file a été interrompue en lecture");
fini=true;
}

String message = queue.firstElement();
queue.remove(0);
taille();
return message;
}

public void taille(){

System.out.println ("il y a " + queue.size() + "éléments dans la liste");

}


}



Et j'aimerai appeller un vector de type queue dans un main mais je n'y arrive pas? ( en fait utiliser les taches qui agissent sur queue )
Cela est-il possible ou est-ce tout simplement pas nécessaire grace aux autres classe?


exemple de classe qui utilise queue:


public class Producteur extends Thread {


private int numero;
private String message;
private long intervale;
private Queue queue;


public Producteur (int numero, String message, long intervalle, Queue queue){

this.numero = numero;
this.message=message;
this.intervale=intervale;
this.queue=queue;

}


public void run(){

boolean fini = false;
while(!fini){

try
{
sleep(this.intervale);

}
catch (InterruptedException e1)
{
System.out.println ("le producteur " + numero + "a été interompu");
fini=true;
}



if(!fini)
{
queue.ecrit(message);
System.out.println ("le producteur" + numero + "a écrit un message" + message + "dans la file");

}

}

}
}






Et ensuite j'ai une classe d'un programme fonctionnel et j'aimerai un éclaircissement:


voici la classe :

import java.io.Serializable;


public class Monnaie implements Serializable {
/**
*
*/
private static final long serialVersionUID = 5292042252928489543L;

String name;
float taux;

public Monnaie() {
this.name = "";
this.taux = (float)0.0;
}

public Monnaie( String nom, float t ) {
this.name = nom;
this.taux = t;
}
}


(L'objet monnaie est utilisé dans une communication client serveur sur un base de donnée oracle)


J'aimerai savoir pourquoi Monnaie est construit deux fois , l'intéret de faire ceci.

(je peux donner les autres classes client serveur si cela est nécessaire)


Merci d'avance
Configuration: Windows XP
Firefox 2.0.0.15
Répondre à mathyass  Signaler ce message aux modérateurs Aller au dernier message

1


  • 1
    Ce message vous semble utile, votez !
  • Ce message ne vous semble pas utile, votez !
  • Signaler ce message aux modérateurs
X-Fan, le lundi 7 juillet 2008 à 23:26:57
Ton objet Vector <String> queue; est private (puisque tu l'as déclaré comme tel).
Pour le récupérer, tu dois créer une classe du genre:

public queue getvector(){
return queue;
}

Assure toi donc que l'objet dans quoi tu vas le mettre sera aussi un vecteur ;)


Pour ton deuxième cas, comme tu peux le voir, le nom de ta class est "Monnaie" et le nom des deux méthodes nommées est "Monnaie". Lorsqu'une méthode porte le même nom que sa classe, elle est appelée un constructeur. Ma parole, tu n'as pas appris les bases du java toi. :P

Lorsque tu fais:
Monnaie m = new Monnaie();
La méthode appelée dans ta classe "Monnaie" sera "Monnaie" (donc ton constructeur).

En programmation objet il a la notion de polymorphisme. Un exemple de polymorphisme est la "surcharge" c'est-à-dire le fait de donner plusieurs fois le même nom à plusieurs méthodes différentes dans une même classe mais en leur spécifiant des paramètres différents.

Donc ton polymorphisme c'est ici la surcharge de ta méthode Monnaie. Ta première méthode ne prend aucun paramètre et la deuxième prend un string et un float. Donc pour construire un objet de cette classe, tu as deux façons:
1- Monnaie m = new Monnaie(); //appellera ta première méthode
2- Monnaie m = new Monnaie("salut",0.1); //appellera ta deuxième méthode

Et comme tu peux le voir, dans ton cas, le but d'avoir deux fois cette méthode est bien simple. La première méthode est utilisée lorsque l'utilisateur ne spécifie aucun paramètre (on donne donc des valeurs par défaut qui sont "" pour le name et 0.0 pour le taux). La deuxième est utilisée dans le cas où l'utilisateur a entré deux paramètres et donc name prendra la valeur donnée en paramètre et taux de même). "Can't we learn from history, why's it such a mystery?"
Répondre à X-Fan

2


  • 1
    Ce message vous semble utile, votez !
  • Ce message ne vous semble pas utile, votez !
  • Signaler ce message aux modérateurs
mathyass, le mardi 8 juillet 2008 à 09:38:23
Bonjour X fan

Merci pour tes explications.

Déjà pour ma 2eme question , je sais qu'une méthode de même nom que la classe est un constructeur mais je ne voyais pas l'utilité du polymorphisme donc merci à toi.


Pour ma première question en fait ma classe Queue existe déjà ainsi que ses méthodes comme tu l'as vu. J'ai peut être mal formulé ma question je ne voulais pas récupérer par un return mais en fait une instance queue de Queue pour travailler dessus avec Produceur par exemple.
Mais l'appel de type Queue queue = new Queue(); ne semble pas fonctionner. Comprends-tu ma question?


Merci beaucoup à toi en tous cas

Math
Répondre à mathyass

3


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
nerus, le mardi 8 juillet 2008 à 10:38:17
Bonjour mathyass,

première chose, il me semble, si j'ai bien compris que ce que tu souhaites faire avec Vector c'est une Pile!!! donc je te conseillerai d'utiliser la classe Stack plutot que Vector!!! Elle possède les méthodes dont tu as besoin! push et pop!!!

Pour ton problème d'appel de ta classe Queue dans un main, verifie que ta variable est soit locale :
public static void main(String[] args)
{
Queue q = new Queue();
}

s'il s'agit d'un attribut de ta classe, vérifie qu'il soit bien static!!

private static Queue q;
public static void main(String[] args)
{
q = new Queue();
}

j'espère avoir répondu à ta question!
Répondre à nerus

4


  • 1
    Ce message vous semble utile, votez !
  • Ce message ne vous semble pas utile, votez !
  • Signaler ce message aux modérateurs
X-Fan, le mardi 8 juillet 2008 à 16:36:09
Perso, j'ai presque toujours utilisé celle là:
public static void main(String[] args)
{
Queue q = new Queue();
}

Et cela fonctionne toujours. Donc je ne vois pas pourquoi dans ton cas elle ne fonctionnerait pas.


EDIT:
public Queue() {

queue = new Vector();

}

1- Tu n'es pas obligé de mettre public en avant de Queue car c'est un constructeur.
2- essaie de mettre: this.queue à la place de queue tout seul. ;) "Can't we learn from history, why's it such a mystery?"
Répondre à X-Fan

5


  • 1
    Ce message vous semble utile, votez !
  • Ce message ne vous semble pas utile, votez !
  • Signaler ce message aux modérateurs
mathyass, le mercredi 9 juillet 2008 à 11:07:21
Merci à vous j'ai réussi à régler mon soucis en utilisant Queue q = new Queue(); que j'avais mal utilisé.
Par contre après j'ai eu un soucis avec un string utilisé comme paramètre dans une classe à part





private int numero;
private String message;
private long intervale;
private Queue queue;


public Producteur (int numero, String message, long intervalle, Queue queue){

this.numero = numero;
this.message=message;
this.intervale=intervale;
this.queue=queue;

}



Pour entrer le paramètre message quand j'appel un producteur dans ma méthode main :
Producteur p1 = new Producteur(1,mess,1000,queue1);

J'ai eut une erreur sur le mess: tout d'abord je ne l'avais pas déclaré (dans ma classe main)
public String mess = "message test";
ensuite le programme me demandai de le passer en static public static String mess = "message test"; ce qui a fonctionné.
D'où une question que je me pose: quand on entre un parametre int (dans un appel d'une instance dans la méthode main) on a nul besoin de le déclarer mais un string oui il a une raison? (désolé si ma question est bête mais je m'y met en essayant de bien comprendre )






Et une autre petite question o passage.
Si j'écrit par exemple Boolean test = false;

while (!test) j'ai un doute avec cette condition quelqu'un peut il me dire clairement? car j'hésite avec tant que test est false => !test est true donc on reste dans la boucle mais je ne suis pas certain.



Merci à vous tous pour votre aide :)
Répondre à mathyass

6


  • 1
    Ce message vous semble utile, votez !
  • Ce message ne vous semble pas utile, votez !
  • Signaler ce message aux modérateurs
mathyass, le mercredi 9 juillet 2008 à 11:47:12
Oups j'ai écrit une bétise et je peux pas éditer
Mais c'est bon pour mon histoire de static j'ai juste oublié de mettre les "" dans la déclaration :
Producteur p1 = new Producteur(1,"mess",1000,queue1); honte à moi lol je m'excuse

Par contre pour le ! je veux bien vos eclaircissement ^^

Mathyass
Répondre à mathyass

7


  • 1
    Ce message vous semble utile, votez !
  • Ce message ne vous semble pas utile, votez !
  • Signaler ce message aux modérateurs
X-Fan, le mercredi 9 juillet 2008 à 15:34:05
Boolean test = false;

while (!test)
{
blablabla...
}

Cela veut dire, tant que différent de test. Mais je suppose que comme il n'y a pas d'élément de comparaison, soit c'est une boucle infinie soit ça ne passe pas dedans (essaie avec le débugger).
Je sais que while (test) est infini mais j'ai jamais essayé avec un ! devant mais peut-être que ce sera le même résultat (vu que rien a comparé donne toujours vrai).

Fait un test en mettant un System.out.println("salut"); et regarde si ça affiche. "Can't we learn from history, why's it such a mystery?"
Répondre à X-Fan

8


  • 1
    Ce message vous semble utile, votez !
  • Ce message ne vous semble pas utile, votez !
  • Signaler ce message aux modérateurs
mathyass, le jeudi 10 juillet 2008 à 10:05:41
Bon il semblerait que ce soit une boucle infinie à part si la tache est interrompue merci :)
Répondre à mathyass

14


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
samalairbien, le samedi 12 juillet 2008 à 14:58:34
Ta boucle while(!test) n'est pas forcément infinie (et c'est à souhaiter qu'elle ne le soit pas!).

Puisque tu as initialié le booléen test à false, au premier passage, le sens de cette instruction est "si on test est à vrai, je rentre dans la boucle". Si tu ne modifies jamais test dans ton corps de boucle, effectivement cela devient une boucle infinie.

Mais le but de cette construction est de dire, à un moment dans le corps de la boucle, test=true, de sorte que le prochain test "while(!test)" soit à faux et qu'on sorte de la boucle (est-ce que non-test est à vrai? non puisque test est à vrai).
Répondre à samalairbien

9


  • 1
    Ce message vous semble utile, votez !
  • Ce message ne vous semble pas utile, votez !
  • Signaler ce message aux modérateurs
mathyass, le jeudi 10 juillet 2008 à 16:49:58
Re à tous,


Bon j'ai encore des eclaircissements à vous demander mais comme j'ai commencé un topic je pense continuer dessus à part si un modérateur y vois un inconvénient.

Donc voilà c'est au sujet d'un programme de type: client serveur base de données oracle

Voici l'interface :

import java.rmi.Remote;
import java.rmi.RemoteException;
import java.util.ArrayList;



public interface Connex extends Remote {

ArrayList<Monnaie> afficher() throws RemoteException;
int ajoute(Monnaie monnaie) throws RemoteException;
int modifier(Monnaie monnaie) throws RemoteException;
int supprimer(Monnaie monnaie) throws RemoteException;
}


Voici la classe Monnaie :

import java.io.Serializable;


public class Monnaie implements Serializable {
/**
*
*/
private static final long serialVersionUID = 5292042252928489543L;

String name;
float taux;

public Monnaie() {
this.name = "";
this.taux = (float)0.0;
}

public Monnaie( String nom, float t ) {
this.name = nom;
this.taux = t;
}
}


et le début de la classe client :

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.rmi.*;
import java.util.ArrayList;

public class ConnexClient {


private static void afficher( Connex connect ) {
ArrayList<Monnaie> result;
try {
result = connect.afficher();

for( Monnaie monnaie : result) {
System.out.println("Devise: "+monnaie.name+"\tValeur: "+monnaie.taux);
}
} catch (RemoteException e) {
e.printStackTrace();
}
}



Ici la méthode afficher renvoi le résultat de la méthode connect.afficher() de l'interface implémentée par le serveur (car la méthode executeQuery de jdbc retourne un ResultSet qui n'est pas sérialisable et ne peut donc pas être renvoyé directement via un RMI et il faut donc recopier les données du ResultSet dans une collection de données sérialisable) mais je ne comprend pas la condition for( Monnaie monnaie : result)...?



De plus voici l'implémentation sur le serveur:


public synchronized ArrayList<Monnaie> afficher() throws RemoteException {
ArrayList<Monnaie> monnaies = new ArrayList<Monnaie>();

try {
System.out.println(InetAddress.getByName(getClientHost()).getHostName() + " affiche");
String requete = "SELECT * FROM monnaie";
System.out.println("requete: "+requete);
ResultSet result = stmt.executeQuery(requete);

while( result.next() ) {
monnaies.add(new Monnaie(result.getString(1),Float.parseFloat(result.getString(2))));
}
return monnaies;


} catch (Exception e) {
e.printStackTrace();
return null;
}
}




Ici je ne comprend pas : monnaie (dans la commande SELECT * monnaie) représente quoi ici?? (ce n'est pas monnaies créée ni le type d'objet Monnaie). De plus monnaies va donc contenir tous les résultats que result va parcourir mais comment la méthode du client parcours monnaies pour les afficher?


Mon post est lourd et j'ai posé pas mal de questions je suis désolé mais j'aimerai bien comprendre.
Si vous avez des questions complémentaires avant de me répondre n'hésitez pas.



Merci d'avance :)


Mathyass
Répondre à mathyass

10


  • 1
    Ce message vous semble utile, votez !
  • Ce message ne vous semble pas utile, votez !
  • Signaler ce message aux modérateurs
X-Fan, le jeudi 10 juillet 2008 à 19:09:23
Ben tu dois avoir une table "monnaie" dans ta base de données.

Result contiendra toutes les lignes de ta base de données pour la table "monnaie" et le while( result.next() ) lit en fait toutes les lignes une à une jusqu'à qu'il arrive à la fin (les lignes récupérées grâce à la requête).
Dans ce while, il récupère donc les infos de chaque ligne de ta table "monnaie" et il les met dans un array (un tableau quoi).

Et puis pour l'affichage, il y a un
for( Monnaie monnaie : result) {
System.out.println("Devise: "+monnaie.name+"\tValeur: "+monnaie.taux);
}

C'est dans cette boucle qu'il fait l'affichage. "Can't we learn from history, why's it such a mystery?"
Répondre à X-Fan

11


  • 1
    Ce message vous semble utile, votez !
  • Ce message ne vous semble pas utile, votez !
  • Signaler ce message aux modérateurs
mathyass, le jeudi 10 juillet 2008 à 20:55:01
Ok merci par contre j'avais compris pour la boucle d'affichage mais c'est la condition for( Monnaie monnaie : result) que je ne comprend pas...
Répondre à mathyass

12


  • 1
    Ce message vous semble utile, votez !
  • Ce message ne vous semble pas utile, votez !
  • Signaler ce message aux modérateurs
X-Fan, le jeudi 10 juillet 2008 à 21:03:08
Désolé je n'ai jamais vu ça et je n'ai jamais fait de java avec des bases de données en même temps. J'ai fait les deux mais c'était séparé et je ne connais que SQL et pas Oracle.

Donc je pourrais pas te dire. ;) "Can't we learn from history, why's it such a mystery?"
Répondre à X-Fan

13


  • 1
    Ce message vous semble utile, votez !
  • Ce message ne vous semble pas utile, votez !
  • Signaler ce message aux modérateurs
mathyass, le samedi 12 juillet 2008 à 12:28:49
Arf pas grave Xfan


Qulequ'un peut m'aider?
Répondre à mathyass

15


  • 1
    Ce message vous semble utile, votez !
  • Ce message ne vous semble pas utile, votez !
  • Signaler ce message aux modérateurs
mathyass, le samedi 12 juillet 2008 à 15:14:46
Bon j'ai trouvé c'est une maniere particulère de faire les boucles mais j préfère avec les itérateurs et la syntaxe normale merci à tous
Répondre à mathyass

16


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
 nerus, le dimanche 13 juillet 2008 à 17:51:35
bonjour,

List<Monnaie> lst = new ArrayList<Monnaie>();
for(Monnaie m : lst){
...
}

en fait, c'est une manière d'écrire les boucles for que je trouve, personnellement, beaucoup plus sympa!
C'est disponible depuis java 5, ça ressemble à la méthode foreach dans d'autres langage et en fait je trouve ça beaucoup plus facile à traduire en langage humain!! la boucle pour chaque m de type Monnaie dans lst

en fait, c'est la meme chose que :
for(int i =0; i<lst.size();i++){
Monnaie m = lst.get(i);
}

avoue que c'est beaucoup plus simple à écrire!!!

dernière chose
pour ta boucle while, je pense que dans ton cas, tu cherches à utiliser le type boolean (minuscule) et pas la classe Boolean donc déclare boolean test, ce sera mieux je pense!!

à plus
Répondre à nerus

Résultats pour demande d'explication sur un problème java

Javabean c'est quoi Help me (Résolu) Bonjour, Malheureusement je suis encore débutant en java, j'aimerai comprendre comment demander à un utilisateur de saisir 2 nombres et de les additionner ensuite en utilisant beans?? En faite c'est une page en JSP donc boujour la galère!... www.commentcamarche.net/forum/affich-8083291-javabean-c-est-quoi-help-me
[PHP] Pb sur array (Résolu) Bonjour, Pour commencer deja un grand merci a tous ceux qui tenterons de m'aider. Je vais essayer d'etre clair mais cela ne sera pas facile. En gros voila ce que je souhaite mettre en place. C'est un systeme qui va aller chercher tout... www.commentcamarche.net/forum/affich-4043484-php-pb-sur-array
[mythe] JavaScript c'est la même chose que Java mythe Javascript est le même langage que Java Réalité FAUX Explications Ces deux langages existent bien, et ce sont tous les deux des langages de programmation (moins poussée pour le JavaScript), mais ce ne sont pas les mêmes... www.commentcamarche.net/faq/sujet-4614-mythe-javascript-c-est-la-meme-chose-que-java

Résultats pour demande d'explication sur un problème java

OpenOffice.org est écrit en JavaMythe La suite bureautique OpenOffice.org est écrite en Java. C'est pour cela qu'elle est lente. Réalité FAUX Explications OpenOffice.org est écrit en C++. Pas convaincu ? Alors supprimez totalement Java (JRE/JVM/JDK) de votre ordinateur... www.commentcamarche.net/faq/sujet-8728-openoffice-org-est-ecrit-en-java
[Firefox] plugin Java Jre de SunA) Les différentes variantes Java chez Sun B) Installation sous Mandriva Limited Edition 2005 ETAPE 1 ETAPE 2: Création du lien symbolique C) Installation sous debian lenny D) Installation sous ubuntu hardy heron A) Les différentes... www.commentcamarche.net/faq/sujet-1824-firefox-plugin-java-jre-de-sun
Installer Java sous UbuntuPar défaut, Firefox n'est pas fourni avec Java. Voici comment procéder pour l'installer: Ouvrez un terminal (Menu Applications > Accessoires > Terminal) et tapez: sudo aptitude install sun-java6-jre sun-java6-plugin ou sudo aptitude install ... www.commentcamarche.net/faq/sujet-5400-installer-java-sous-ubuntu

Résultats pour demande d'explication sur un problème java

Void dans java (Résolu)Bonjour tout le monde je suis completement new dans java je voudrais avoir une explication concernant le mot clef " void" et son utilisation dans la definition de mothodes ou procedures des classes . en effet j ai googlé beaucoup mais tout ce que j ai... www.commentcamarche.net/forum/affich-5739681-void-dans-java
[Javascript] Utiliser un parametre en URL (Résolu)Bonjour, J'ai un petit souci en javascript lors du passage d'un parametre pour ouvrir une URL 2 exemples valent bcp mieux qu'une longue explication (le 1er fonctionne, le 2eme non et je cherche a le realiser) ---------------------------... www.commentcamarche.net/forum/affich-4648828-javascript-utiliser-un-parametre-en-url
Aide en Java <methodes de transfert> (Résolu)Bonjour à tous ^^ Voilà je débute en Programmation java et nage un peux. J'aurais besoin d'une petite explication... pour les methodes de transfer par exemple dans une classe (compteBanquaire) j'ai ceci : public double setdepot() {... www.commentcamarche.net/forum/affich-4949561-aide-en-java-methodes-de-transfert

Résultats pour demande d'explication sur un problème java

Télécharger Cavaj Java DecompilerCavaj Java Decompiler est un éditeur gratuit de code Java. Il permet de recomposer le code source Java d'un fichier CLASS. Il prend en charge la décompilation des applets Java, des archives ZIP et JAR. Le code source Java obtenu est précis. Il intègre... www.commentcamarche.net/telecharger/telecharger-34056787-cavaj-java-decompiler
Télécharger JavaScript ObfuscatorJasob JavaScript Obfuscator est un logiciel de protection de code Javascript. Il intègre une interface simple. Il vous permet de convertir votre code Javascript en un code incompréhensible pour l’homme mais lisible pour le navigateur. Le logiciel... www.commentcamarche.net/telecharger/telecharger-34056889-javascript-obfuscator
Télécharger Java ToolsJava Tools est un IDE très léger pour la création, la compilation, l'exécution et le débogage des applications Java et des applettes. L'outil inclus des points et des clics d'accès aux commandes Java, aux documents, au répertoire et aux fichiers. Il... www.commentcamarche.net/telecharger/telecharger-34056297-java-tools

Résultats pour demande d'explication sur un problème java

Javascript - Introduction au langage JavascriptQu'est-ce que le Javascript? Le Javascript est un langage de script incorporé dans un document HTML. Historiquement il s'agit même du premier langage de script pour le Web. Ce langage est un langage de programmation qui permet d'apporter des... www.commentcamarche.net/contents/javascript/jsintro.php3
Javascript - Les événementsQu'appelle-t-on un événement? Les événements sont des actions de l'utilisateur, qui vont pouvoir donner lieu à une interactivité. L'événement par excellence est le clic de souris, car c'est le seul que le HTML gère. Grâce au Javascript il est... www.commentcamarche.net/contents/javascript/jsevent.php3
Java - Premier programmePremière application avec Java La première chose à faire est de créer un simple fichier texte (sans mise en forme) et de taper les quelques lignes suivantes : // Votre premiere application en Java class FirstApp { public static void main... www.commentcamarche.net/contents/java/javaprem.php3