Se connecter avec
S'enregistrer | Connectez-vous

You are not allowed to do this.

Aide java

Dernière réponse : dans Programmation

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

Lassé par la pub ? Créez un compte
Expert Programmation

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".

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)

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

}

}

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;


}
Expert Programmation

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 ?

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

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.

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???

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.
Lassé par la pub ? Créez un compte
Tom's guide dans le monde