Se connecter / S'enregistrer
Votre question

Aide java

Tags :
  • Io
  • Programmation
Dernière réponse : dans Programmation
11 Juillet 2008 16:29:30

Bonjour à tous,

J'aimerai un petit éclaircissement de votre part:

Voici la méthode sur laquelle j'ai un soucis


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);



La classe monnaie associée :

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;
}
}



Mon intérrogation se pose sur la condition dans le for : for( Monnaie monnaie : result) quelqu'un pourrait me dire à quoi elle correspond?


Merci d'avance

mathyass

Autres pages sur : aide java

a b L Programmation
11 Juillet 2008 23:02:00

Citation :
quelqu'un pourrait me dire à quoi elle correspond?

En java, a priori, rien.

ça compile ce machin?
12 Juillet 2008 12:27:58

oui sa compile et sa fonctionne très bien y a pas tout le systeme client serveur ici car je voulai juste savoir a quoi correspond cette condition dans le for si quelqu'un pouvai m 'aider

Contenus similaires
a b L Programmation
12 Juillet 2008 14:13:21

Bon, je suis allé vérifier tout ça, et effectivement, il existe ce for (que je ne connaissais pas pour le Java :)  ).
http://java.sun.com/docs/books/tutorial/java/nutsandbolts/for.html

Dans les spécifications du langage c'est le "enhanced for" (au chapitre 14.14.2):
http://java.sun.com/docs/books/jls/third_edition/html/statements.html

Donc, dans ton cas, ça boucle sur les éléments de la liste "result", et dans la boucle, l'élément courant est dans la variable "monnaie" de type "Monnaie".
12 Juillet 2008 15:13:22

Merci j'ai compris mais en fait on peut utiliser cette boucle à sa place?
{
int p = 0;
Iterator<Monnaie> i = result.iterator();
while (i.hasNext())
{
System.out.println("Devise: "+monnaie.name+"\tValeur: "+monnaie.taux);

p++;

}

12 Juillet 2008 15:19:45

En tout cas merci j'ai compris cette boucle.
je vais ne profiter puisque tu as été capable de m'aider
Je fait une connexion client serveur base de donnée oracle avec rmi et jdbc
J'ai cette erreur quand je connecte le client (serveur rmiregistry)


Exception in thread "main" java.lang.NoSuchMethodError: stub class initialization failed
at Conneximp_Stub.<clinit>(Unknown Source)
at sun.misc.Unsafe.ensureClassInitialized(Native Method)
at sun.reflect.UnsafeFieldAccessorFactory.newFieldAccessor(Unknown Source)
at sun.reflect.ReflectionFactory.newFieldAccessor(Unknown Source)
at java.lang.reflect.Field.acquireFieldAccessor(Unknown Source)
at java.lang.reflect.Field.getFieldAccessor(Unknown Source)
at java.lang.reflect.Field.getLong(Unknown Source)
at java.io.ObjectStreamClass.getDeclaredSUID(Unknown Source)
at java.io.ObjectStreamClass.access$700(Unknown Source)
at java.io.ObjectStreamClass$2.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.io.ObjectStreamClass.<init>(Unknown Source)
at java.io.ObjectStreamClass.lookup(Unknown Source)
at java.io.ObjectStreamClass.initNonProxy(Unknown Source)
at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
at java.io.ObjectInputStream.readClassDesc(Unknown Source)
at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)
at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
at java.rmi.Naming.lookup(Unknown Source)
at Client.main(Client.java:48)


merci d'avance

(si besoin je met le code)
a b L Programmation
12 Juillet 2008 16:12:44

Qu'est-ce que tu as en ligne 48 de Client.java ? une instanciation d'objet de type Connex ?
est-ce que tu as bien défini le ou les constructeurs ?
12 Juillet 2008 16:34:43

Je te met le code (c est le client)

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.util.ArrayList;




public class Client {




private static void afficher(Connex terface) throws RemoteException {

ArrayList<Monnaie> result;


try{


result = terface.afficher();

for (Monnaie monnaie : result) {System.out.println("devise : "+monnaie.nom+" Valeur : "+monnaie.taux);}

}

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



}


public static void main (String args[]){
String nom;
BufferedReader clavier = new BufferedReader(new InputStreamReader(System.in));
String nom_externe = "//m117/Connex";
System.out.println("bon on y va");


Connex terface;

try{


terface = (Connex) Naming.lookup (nom_externe);
Integer Menu;
Boolean continuer = true;


while (continuer)

{
System.out.println("1 Afficher la table");
System.out.println("2 Ajouter valeur");
System.out.println("3 Modifier valeur");
System.out.println("4 Supprimer valeur");
System.out.println("5 Quitter");

Menu = Integer.parseInt(clavier.readLine());

switch (Menu) {


case 1 :

afficher (terface);
break;


case 2 :

System.out.println("nom de la monnaie?");
nom = clavier.readLine();
System.out.print("Entrez la valeur:");
if(terface.ajoute(new Monnaie(nom,Float.parseFloat(clavier.readLine())))==0)

{ System.out.println("Monnaie ajoutée");}

else {System.out.println("sa a merdé");}

break;

case 3 :

System.out.println ("nom de la valuer à modifier");
nom = clavier.readLine();
System.out.println("Entre le nouveau taux");
if (terface.modifie(new Monnaie(nom,Float.parseFloat(clavier.readLine())))==0)

{System.out.println("Monnaie modifiée");}

else {System.out.println("sa a merde");}

break;




case 4 :

System.out.println ("nom de la valeur a supprimer");
nom = clavier.readLine();
if (terface.supprime(new Monnaie(nom,0))==0)
{System.out.println("c fait");}


else {System.out.println("relou");}

break;


case 5:

System.out.println("ciao");
continuer = false;
break;

default:

}
}
}

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

}

}
a b L Programmation
12 Juillet 2008 19:17:34

Et la classe Connex, elle sort d'où ? comment est-elle déclarée ?

Ton erreur est là:
  1. terface = (Connex) Naming.lookup (nom_externe);
la conversion du Remote en Connex
13 Juillet 2008 13:25:15

Connex est l'interface qui est implémentée par la classe du serveur du rmi quoi

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


public interface Connex extends Remote {

ArrayList<Monnaie> afficher() throws RemoteException;
int ajoute(Monnaie monnaie) throws RemoteException;
int modifie (Monnaie monnaie) throws RemoteException;
int supprime (Monnaie monnaie) throws RemoteException;


}
a b L Programmation
13 Juillet 2008 15:34:07

Il ne faut pas mettre un rmi:// devant le nom de l'objet ?
Comment as-tu fais le bind côté serveur ? et comment as-tu implémenté l'interface Connex côté serveur ?
As-tu mis en place le registre RMI ?
13 Juillet 2008 16:57:23

J'ai déjà fait des clients serveur sans mettre le rmi

SI je le met sa donne de nouvelles erreurs:

java.rmi.NotBoundException: rmi//m117/Connex
at sun.rmi.registry.RegistryImpl.lookup(RegistryImpl.java:106)
at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source)
at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:386)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:250)
at sun.rmi.transport.Transport$1.run(Transport.java:159)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Transport.java:155)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:790)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:649)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
at java.lang.Thread.run(Thread.java:619)
at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(Unknown Source)
at sun.rmi.transport.StreamRemoteCall.executeCall(Unknown Source)
at sun.rmi.server.UnicastRef.invoke(Unknown Source)
at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
at java.rmi.Naming.lookup(Unknown Source)
at Client.main(Client.java:49)


le serveur :

import java.io.*;
import java.rmi.*;
import java.rmi.registry.*;
import java.rmi.server.*;
import java.net.*;
import java.sql.*;
import java.util.ArrayList;


public class Conneximp extends UnicastRemoteObject implements Connex {

public Connection connexion;
public Statement stmt;

public Conneximp() throws RemoteException {

try{
Class.forName ("oracle.jdbc.driver.OracleDriver");
connexion = DriverManager.getConnection("jdbc:o racle:thin:@m117:1521:XE","system","oracle");
this.stmt= connexion.createStatement();
System.out.println("Connecté à la base");
}
catch (Exception e){ e.printStackTrace();}
}


public synchronized ArrayList<Monnaie> afficher() throws RemoteException {

ArrayList<Monnaie> monnaies = new ArrayList<Monnaie>();

try
{

System.out.println(InetAddress.getByName(getClientHost()).getHostName() + " afficher");
String requete = "SELECT * FROM MONNAIE";
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;}
}


public synchronized int ajoute (Monnaie monnaie) throws RemoteException {

try {

System.out.println(InetAddress.getByName(getClientHost()).getHostName() + "afficher");
String requete = "INSERT INTO MONNAIE VALUES ('" + monnaie.nom + "','" + monnaie.taux.toString().replace(".",",") + "')";
if (stmt.executeUpdate(requete)== 0) {
System.out.println("requete pas exécutée");
return 1;}
}

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

return 0;


}


public synchronized int modifier (Monnaie monnaie) throws RemoteException {
try
{


System.out.println(InetAddress.getByName(getClientHost()).getHostName() + "afficher");
String requete = "UPDATE MONNAIE set VALEUR ('" + monnaie.taux.toString().replace(".",",")+ "' WHERE DEVISE = '" +monnaie.nom+ "')" ;
if (stmt.executeUpdate(requete)==0){
System.out.println("requete pas executée");
return 1;}

}

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

return 0;


}


public synchronized int supprimer (Monnaie monnaie) throws RemoteException {

try
{



System.out.println(InetAddress.getByName(getClientHost()).getHostName() + "afficher");
String requete = "DELETE FROM MONNAIE WHERE DEVISE = '"+monnaie.nom+"' ";
if(stmt.executeUpdate(requete)==0){
System.out.println("requete pas executee");
return 1;}



}

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

return 0;

}


public static void main (String args[]){

try{

String nom_externe = "//m117/Connex";
Connex terface = new Conneximp();
Naming.rebind(nom_externe, terface);
System.out.println("c est parti");

}

catch(Exception e){
e.printStackTrace();
System.out.println("arf");
}
}



}




le rmi registry fonctionne le serveur compile c est a la compilation du client que les erreurs apparaissent
a b L Programmation
13 Juillet 2008 18:25:01

il manque le ":" quand tu mets rmi:// non ?

mais tu as raison c'est à la compilation le problème.
As-tu utilisé rmic pour générer le stub ?
14 Juillet 2008 14:12:38

J'ai plutôt l'impression qu'il ne trouve pas la ressource en question.

Je n'ai pas épluché ton code qui vue de loin me semble dégueulasse ( désolé mais il me pique aux yeux ). Du pur jdbc ( => JPA ) , des sysout ( => log4j ) , naming convention pour les méthodes incompréhensibles ( afficher() qui retourne une liste ).

D'un point de vue jdbc , les prepareStatement rendrait un temps soit peu le code plus clair !

String requete = "UPDATE MONNAIE set VALEUR ('" + monnaie.taux.toString().replace(".","," )+ "' WHERE DEVISE = '" +monnaie.nom+ "')" ;

Heureusement qu'il n'y a pas du swing qui affiche tout cela, sinon on aurait des lignes de 400 caractères.

For(Monnaie monnaie : result){}

Ca fait légèrement du copier coller tout bête et méchant. Ne pas connaître la différence entre cette écriture et l'utilisation d'un Iterator prouve une très mauvaise connaissance du java.

Les objects de type Collection(List , ArrayList , etc ) implémente Iterator depuis java 1.5. Cette ajout permet notamment d'utiliser la boucle forEach et d'éviter d'écrire ce long code remplit de casting que Iterator impose.

15 Juillet 2008 12:16:28

Bon alors RiiMii pour commencer sur ton post tu ne réponds pas à la question mais tu critiques tout simplement.

Mais je peux comprendre et je vais donc te répondre pour que tu comprennes ma démarche.

La boucle c'est effectivement du copier coller sinon j'aurai pas demandé ce qu'elle signifie...(salut j'ai fait un truc qui marche tu peux me l'expliquer?) et je ne connaissai les iterators mais pas cette écriture de for c est tout.

Au niveau du code j'ai pas très bien compris ta critique envers les requetes c'est tout simplement la méthode que j'ai trouvé partout pour utiliser jdbc(et même au niveau des Naming )


Maintenant peux-tu m'expliquer le problème avec la ressourse?

Je n'ai effectivement pas un niveau exellent en java mais j'essaye d'appronfondir certaines choses.J'en fait depuis peu et je m'y met sérieusement depuis très peu de temps. Croies tu que en faisant un post qui en clair dit :"ta boucle c est du copier coller, ton code c est de la merde tu y connais rien en java" c est constructif???
15 Juillet 2008 12:50:37

Salut mathyass ,

Une critique peut être négative comme positive.

Pour les prepareStatement , consulte cette faq : http://java.developpez.com/faq/jdbc/?page=preparedstatement.

Si tu veux aller plus loin dans ton apprentissage pour manipuler des données dans une base de donnée ( et même dans d'autre système structuré de donnée ) avec Hibernate => http://java.developpez.com/faq/hibernate/

Pour le naming convention, je trouve peu clair de voir une fonction nommée " Afficher() " qui retourne une liste de donnée. Il parrait plus clair et compréhensible pour celui qui lit le code de voir quelque chose du style " getMoney()" en insistant bien sur le fait que la présence du "get" devant le nom de la fonction dit que tu prends quelque chose.

D'ailleurs pour te citer d'autres bonnes habitudes ( qui sont bénéfiques pour la suite ) , je te conseillerai de déclarer première une interface pour chaque table ( on ne parle pas encore de notion de mapping vu que tu n'utilises pas hibernate ) dans laquelle on retrouvera 4 méthodes CRUD ( Create - Read - Update - Delete ) et ensuite une classe qui implémente ce crud ( que l'on peut généralisé avec l'utilisation des generics , mais n'allons pas trop vite ) .

L'interface :
  1. public interface MoneyDao{
  2. public Money getMoney(Long id);
  3. public List<Money> getMoneys();
  4. public void insertMoney(Money money);
  5. public void deleteMoney(Money money);
  6. }


L'implementation :

  1. public class MoneyDaoImpl implements MoneyDao{
  2.  
  3. public Money getMoney(Long id){
  4.  
  5. // ton code jdbc ou hibernate ( rien n'empêche d'écrire des implémentations pour chacune)
  6.  
  7. }
  8.  
  9. public List<Money> getMoneys(){
  10. //idem
  11. }
  12.  
  13. //etc...
  14.  
  15. }


Tant qu'il y a moyen d'éviter les Iterators , il faut le faire. La nouvelle syntaxe du for permet de coder moins de ligne mais surtout d'utiliser un typage très fort , ce que tu as d'ailleurs déjà bien commencé vu que je vois que tu n'oublies pas de typer tes List.

Quand je dis qu'il ne semble pas trouver la ressource, c'est parce que ton erreur vient d'ici :

java.rmi.NotBoundException: rmi//m117/Connex
at sun.rmi.registry.RegistryImpl.lookup(RegistryImpl.java:106)

Ce qui me fait penser tout simplement que lorsque tu fais le lookup avec le " Name " que tu lui donnes , ce service n'existe pas du côté serveur.
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS