[Java] Le topic-passage-obligé pour débutants !

Le topic-passage-obligé pour débutants ! [Java] - Divers - Programmation

Marsh Posté le 22-04-2005 à 13:29:01    

Bonjour,
 
Suite à de nombreux topics créés par des débutants en java, et sous l'impulsion de mon exaspération, j'ai décidé de créer ce topic, qui a pour but de devenir un passage obligé pour tout débutant en java passant par ici.
 
Nous aborderons quelques sujets de base, et éviterons toute discussion/flamewar inutilement longue. Je tâcherai d'éditer les premiers posts pour les tenir à jour.
 
Sujet abordés:
 
* Tutos / réferences : quelques bons liens vers de la bonne documentation accessible. Pas questions ici de dupliquer le topic javafaq/bibliolinks, soyons efficaces, soyons bref; nous n'y mettrons que l'essentiel pour bien débuter.
 
* Comment débuter en Java, pourquoi il ne faut pas commencer avec un IDE.
 
* Mini-FAQ, ou comment résumer en un post 50% des questions de débutants posées ici.
 
* Les bons réflexes pour aller plus loin.


Message édité par Harkonnen le 11-12-2007 à 14:31:36

---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 22-04-2005 à 13:29:01   

Reply

Marsh Posté le 22-04-2005 à 13:29:45    

Tutos / réferences :
Ici, quelques bons liens vers de la bonne documentation accessible. Pas questions ici de dupliquer le topic javafaq/bibliolinks, soyons efficaces, soyons bref; nous n'y mettrons que l'essentiel pour bien débuter.
[:icon4] L'anglais sera de rigueur pour beaucoup de ces références. Comme le dit Nasser Kettani, Le premier langage à apprendre pour programmer, c'est l'anglais. (Ce qui, au passage, ne dispense pas non plus d'écrire le français correctement)

 

* Tutoriels
- les inévitables tutoriels de Sun, généralement assez bien faits : http://java.sun.com/docs/books/tutorial/ Couvrent beaucoup de sujets, anglais de rigueur. (Premiers pas en Java : de l'installation à l'execution d'un HelloWorld - table des matières complète)
- Thinking In Java et Penser En Java (Traduction en français) : Excellent bouquin, dispo gratuitement sur le net.

 


* Références
- La Javadoc: in-dis-pen-sable ! http://java.sun.com/j2se/1.5.0/docs/api/ (pour 1.4 et pour 1.3) S'il le faut, on expliquera comment s'en servir. ([:icon3] La plupart du temps, le nom d'une classe dans google mène droit à la javadoc correspondante)
- Les conventions de codage et de nommage : Tres important à suivre. (A fortiori ici, puisque ça permet à quelqu'un qui ne connait votre code de "rentrer dedans" beaucoup plus facilement). ([:icon3] A ce sujet, merci d'éviter les horribles mélanges anglais/français dans votre code) Trois règles de base: 1) Un nom de classe commence toujours par une majuscule, si le nom la classe comporte plusieurs mots, on alterne majuscule/miniscule; exemple: BindingService - 2) Les variables commencent par une minuscule, exception faite pour les constantes qui sont entièrement en majuscules - 3) Une méthode commence toujours par une miniscule. Si le nom de la méthode comporte plusieurs mots, on alterne miniscules/majuscules:
exemple: getRelatedData(). D'autre part, les noms de classes et les noms de variables sont des noms communs génériques, les méthodes des verbes (plutôt d'action).
- Java Notes. These Java programming notes are written to fill in missing or weak topics in textbooks that [the author has] taught from. Many pages are useful for reference, but not as an ordered tutorial. Some pages are still rough drafts, but [the author is] slowly working on fixing them.[/url]
- Java Basics.[the author has] started writing a more coherent tutorial called Java Basics. In addition to lessons, there is also commentary which explains why things are done the way they are.
 
- La FAQ de developpez.com
- Tout ce que vous avez toujours voulu savoir sur le CLASSPATH
- Le topic sur les Exceptions (à valider)
- Google : eh oui ! Devant un message d'erreur abscon, google pourra vous aider, et cela évitera un tas de topics inutiles et redondants.

 
Citation :

A éditer et completer

Message cité 1 fois
Message édité par the real moins moins le 17-03-2009 à 14:54:19

---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 22-04-2005 à 13:30:01    

Comment débuter en Java
... et pourquoi il ne faut pas commencer avec un IDE.
 
* Quelqu'un se dévoue pour écrire un truc simple sur l'installation propre de java?
 
* Avec quoi j'édite mes sources?
Nous sommes quelques valeureux vieux cons ici à croire fermement que pour débuter, il vaut mieux éviter les IDE (Integrated Development Environment). On conseille donc un simple editeur de texte genre Context, jEdit, ultraedit, ou autre, et un shell pour commencer. Cela permet de vite comprendre les méchanismes sous-jacents de java, le classpath et ce genre de choses - certes, au prix de quelques frustrations parfois - ce qui évitera à terme de tomber le bec dans l'eau quand l'on voudras sortir l'appli de l'éditeur. (Parce qu'en général à ce moment là, on a justement plus envie de se prendre les pieds dans des trucs de débutant)
 

Citation :

A éditer et completer


Message édité par the real moins moins le 22-04-2005 à 13:39:09

---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 22-04-2005 à 13:33:52    

Mini-FAQ
* JRE, JDK, J2SE, J2EE, J2ME, chuis perdu !
Alors, un petit résumé:
JRE : Java Runtime Environment : ça sert, comme le nom l'indique, à éxécuter des applications écrites en Java.
JDK : Java Development Kit : ça sert, comme le nom l'indique, à développer des applications en Java. Inclus une JRE.
J2SE : Java 2 Standard Edition : si vous commencez Java, c'est ce qu'il vous faut.
J2EE : Java 2 Enterprise Edition : J2EE est une "extension" de Java, composée de multiples APIs (EJB, JMX, JTA, et bien d'autres). A priori, il n'y a pas besoin de l'installer, contrairement à ce que l'on pourrait croire. Installez-vous un serveur d'application, et les jar nécessaires sont fournis. Vous pouvez bien entendu "télécharger J2EE", mais je conseillerais de ne rien "installer", mais simplement d'utiliser les jars fournis (voir topic classpath)
J2ME : Java 2 Micro Edition : une version "réduite" de Java, pour les appareils mobiles. (Téléphones, PDAs, ...)
 
* Comment installer la librairie XYZ?
En java, une libraire est, la plupart du temps, constituée d'un simple jar. Il suffit donc de mettre celui-ci dans votre classpath, grace à l'une des nombreuses méthodes décrites dans le topic idoine. (Voir plus haut)
 
* Lire/écrire dans des fichiers
Rapportez vous au tuto de Sun sur les i/o. En deux mots, pour lire ou écrire des chaînes de caractères, utilisez Reader/Writer et leurs implémentations; pour lire ou écrire des données binaires, utilisez InputStream/OutputStream et leurs implémentations. A partir de la jdk1.4, il y a aussi le package java.nio - si quelqu'un veut l'introduire en 2 mots ici...
Il est aussi souvent question de "logger" ce que fait votre application: dans ce cas, ne perdez pas votre temps, et utilisez l'api de logging de java (à partir d'1.4) ou log4j (il existe d'autres api de logging)
 
* Lire des *resources*
Un petit lien qui explique comment accéder à des resources dans le classpath (vu que la question revient régulierement et que le topic classpath n'en fait pas mention): http://java.sun.com/j2se/1.5.0/doc [...] urces.html
(TODO : expliquer que fichier != resource)
 
* NoClassDefFoundException, NoClassDefFoundError ??
Rapportez vous au topic classpath: soit votre classe principale ne peut être trouvée par Java, soit il manque un jar sur votre classpath.
 
* ... cannot be referenced from a static context !?
Vous essayez probablement d'appeler une méthode d'instance depuis un "contexte statique", le plus souvent votre méthode main. Renseignez-vous sur la signification du mot clé static.
 
* NullPointerException !?
Vous essayez vraisemblablement d'appeler une méthode sur un objet non initialisé, ou vous passez une réference nulle à une méthode qui ne peut l'utiliser. En lisant la stacktrace attentivement, vous devriez trouver facilement l'origine du problème. (Classe et n° de ligne dans le code source)
 

Citation :

A éditer et completer

Message cité 1 fois
Message édité par the real moins moins le 10-02-2006 à 12:22:49

---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 22-04-2005 à 13:35:24    

Les bons réflexes pour aller plus loin
* Se réferer à la javadoc (cfr ci-dessus pour les liens)
* Maîtriser l'anglais [:dawa]
 

Citation :

A éditer et completer

Message cité 1 fois
Message édité par the real moins moins le 10-08-2006 à 21:25:42

---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 22-04-2005 à 13:44:40    

Merci de garder ce topic propre, d'éviter les débats, utiles ou pas: gardons ça pour les topics qui ont amenés à la création de celui-ci, afin de le garder succint et d'ainsi éviter de rebuter notre cher ami le débutant.
 
Que ceci ne vous empêche bien sur pas de contribuer à ce topic ou de proposer des améliorations :hello:


Message édité par the real moins moins le 22-04-2005 à 13:47:44

---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 24-04-2005 à 12:02:02    

:jap: ... j'aurais pas cru ca de toi ;)
 
pour contribuer, des idées de questions récurrentes :  
 
- expliquer la NPE, et les coups classiques qui la provoquent (objet déclaré mais pas initialisé, etc...)
- mettre un lien vers les dessous de string


Message édité par Jubijub le 24-04-2005 à 12:08:57

---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 24-04-2005 à 13:01:03    

the real moins moins a écrit :

t'as vu le nombre de gamins qui se retrouvent comme des cons 3 mois après parce que leur appli démarre pas en dehors de l'ide? problèmes de classpath, de chemins divers, et j'en passe.


bah c'est normal, c'est l'ordre pour faire les choses.
 
 
au moment de leur premier déploiement, ils tombent sur leur premier pb de déploiement.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 24-04-2005 à 14:06:12    

Les "exceptions"
 
Qu'est-ce qu'une exception ?
Une exception est un moyen dont dispose le programmeur/le système pour signaler qu'un problème est survenu.  
On distingue 2 types de problèmes : les exceptions, et les errors.  
- Une erreur est un problème grave, qui conduit à un crash irrécupérable du programme, comme par exemple la OutOfMemoryError : le système ne dispose plus de mémoire disponible, et crashe
- Une exception : une exception est une erreur raisonnablement prévisible,qui ne nécessite pas forcément l'arret du programme. Par exemple, imaginez un formulaire où vous demandez l'age d'une personne. Il est évident que le nombre entré doit être positif. Si pour autant la personne rentre un nombre négatif, ou irréel, ou autre chose qu'un nombre, il vaut mieux afficher un message d'erreur que de terminer le programme. Les exceptions sont un méchanisme qui permet cela.
 
Il faut distinguer 2 grandes catégories d'exceptions : les exceptions filles de RuntimeException, et les autres.  
Lorsqu'une écrit une méthode susceptible de générer une exception (la méthode traitant le formulaire dans mon exemple), toute autre méthode utilisant la première méthode doit "catcher" l'exception, c'est à dire utiliser un bloc try/catch/(finally) pour indiquer au programme ce qui doit se passer si une exception est générée. Ce try/catch est obligatoire pour toutes les exceptions, sauf pour les RuntimeException, pour lesquelles il est facultatif.
 
Note : on ne "catche" pas les errors
 
 

  • La NullPointerException

Cette exception est aussi connue sous son nom abrégé, NPE. C'est une exception très fréquente.
 
Considérons le code suivant :  

Code :
  1. package com.jubijub;
  2. /**
  3. * Created by IntelliJ IDEA.
  4. * User: Jubijub
  5. * Date: 24 avr. 2005
  6. */
  7. public class Test {
  8.     public static void main(String[] args) {
  9.         String[] nameList = {"paulo", null , "titi"};
  10.         String name = nameList[1];
  11.         System.out.println(name.length());
  12.     }
  13. }


 
Lors de son exécution, il produit le code suivant
 

Code :
  1. Exception in thread "main" java.lang.NullPointerException
  2. at com.jubijub.Test.main(Test.java:12)
  3. at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  4. at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
  5. at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
  6. at java.lang.reflect.Method.invoke(Method.java:585)
  7. at com.intellij.rt.execution.application.AppMain.main(AppMain.java:78)
  8. Process finished with exit code 1


 
Ce message s'appelle un stacktrace, c'est à dire qu'il retrace toute les méthodes qui ont été appellée durant l'exécution du morceau de programme qui a conduit à l'exception.
 
Comment lire un stacktrace ?

Code :
  1. Exception in thread "main" java.lang.NullPointerException


Indique une exception, qui a eu lieu dans le thread Main
Le plus intéressant est le java.lang.NullPointerException : il indique le type de l'exception, ici une NPE
 

Code :
  1. at com.jubijub.Test.main(Test.java:12)
  2. at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  3. at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
  4. at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
  5. at java.lang.reflect.Method.invoke(Method.java:585)
  6. at com.intellij.rt.execution.application.AppMain.main(AppMain.java:78)


Ce bloc se lit de bas en haut : la première méthode appellée est donc la dernière de la liste, et la dernière méthode appellée est celle tout en haut.
Toutefois, si cet ordre a été retenu, c'est parce que c'est souvent la dernière méthode appellée qui génère l'exception.

Code :
  1. at com.jubijub.Test.main(Test.java:12)


Ici il faut lire que la méthode main de la class Test du package com.jubijub a été appellée. Le (Test.java:12) indique qu'il y a eu un problème à la 12ème ligne du fichier source Test.java (qui est donc le fichier source qui a servi a générer la classe Test.class)
 
A partir du moment où on utilise un éditeur de texte, il est donc facile de repérer la 12ème ligne, pour chercher d'où vient le problème. Si vous utilisez un IDE, le texte entre parenthèse ou la ligne entière sont généralement cliquable, ce qui permet de se rendre directement a l'endroit voulu.
 
Revenons au code :  
La ligne fautive est la suivante :  

Code :
  1. System.out.println(name.length());


 
Quel est le problème ?
Une nullPointerException signifie que vous essayez d'utiliser un objet référencé par un pointer nul, autrement dit que vous essayer d'utiliser quelquechose qui n'existe pas.
Pour comprendre cela, revenons au modèle objet : un objet dispose d'attributs, et de méthode. Pour pouvoir accéder à un attribut, ou utiliser une méthode, il vous faut une référence valide vers une instance de l'objet en question, et ensuite appeler la méthode désirée de cet objet.
 
La NPE vous indique en l'occurence que la référence qui pointe vers votre objet pointe vers null, autrement dit votre référence est invalide. Vous demander donc à du vide de faire quelque chose, ce qui est impossible.
 
Si on regarde la ligne, il faut regarder toutes les instances d'objet : on ne voit que name. Le code essaye d'afficher la longueur de la String référencée par "name". La NPE indique donc que name est vide.
 
Comment le résoudre ?
Si name est vide, ca qu'il est mal initialisé. On peut initialiser un objet de 2 façons :  
- en appelant un constructeur :  
Integer number = new Integer(2);
- par le résultat d'une méthode
number = myList.length();
 
Une NPE vient très souvent de 2 raisons :  
- vous avez oublié d'appeller le constructeur :
Integer number; // number ne contient rien
- la méthode que vous appellez ne renvoit rien
String lastName = person.getName(); // en apparence tout va bien, mais si l'attribut name de person vaut null, lastName sera null aussi.
 
parfois vous aurez à remonter une chaine de méthode qui s'appellent avant de trouver laquelle renvoit null au lieu de ce qu'elle devrait renvoyer.
 
Si on revient au code, on constate :  

Code :
  1. String[] nameList = {"paulo", null , "titi"};
  2.         String name = nameList[1];


name est initialisé avec ce que contient l'index 1 du tableau nameList. Un tableau a son index qui commence à 0, donc le 1 représente "la deuxième case". Cette case contient null. Donc name vaut null.
 
L'erreur est trouvée, il n'y a plus qu'à corriger.
 
PS : cet exemple est bidon, mais il montre simplement un enchainement de problème.
PPS : si vous faisiez nameList[4], vous auriez droit à l'autre erreur classique : la ArrayOutOfBoundException, qui indique que vous demander un index en dehors des limites du tableau
 


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 24-04-2005 à 14:06:26    

PS : tapez pas trop fort ;)
 
J'ai essayé d'expliquer :  
- en gros les exceptions
- comment lire un stacktrace (ce qui sert toujours)
- la méthode de recherche de la cause d'une NPE
 
PS : mon chapitre sur l'objet est fumeux, très améliorable


Message édité par Jubijub le 24-04-2005 à 14:07:57

---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 24-04-2005 à 14:06:26   

Reply

Marsh Posté le 24-04-2005 à 14:59:56    

jubi > si l'article est si long, je serais d'avis d'en faire un topic et de le referencer ici, alors


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 24-04-2005 à 15:07:31    

Jubijub a écrit :

PS : tapez pas trop fort ;)
 
J'ai essayé d'expliquer :  
- en gros les exceptions
- comment lire un stacktrace (ce qui sert toujours)
- la méthode de recherche de la cause d'une NPE
 
PS : mon chapitre sur l'objet est fumeux, très améliorable


il manque le dernier chapitre...  
comment catcher (attraper) l'exception et traiter la cas...
et aussi expliquer a quoi sert le finally


Message édité par KangOl le 24-04-2005 à 15:07:59

---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 24-04-2005 à 15:08:23    

the real moins moins a écrit :

jubi > si l'article est si long, je serais d'avis d'en faire un topic et de le referencer ici, alors


non je ne pense pas !
ce qu'il a dit est juste et a toute sa place ici...


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 24-04-2005 à 15:11:25    

A mon avis jubi tu as cherché à trop en dire et c'est trop condensé. Pour un newbie total, je suis pas sur que ton explication sur les exceptions soit très compréhensible. En même temps il y a déjà plein de docs pour expliquer ça, il aurait peut-être été plus judicieux de se concentrer sur le point de détail que tu voulais évoquer : qu'est-ce qu'une NPE, d'où ça vient et comment les repérer facilement.


---------------
Au royaume des sourds, les borgnes sont sourds.
Reply

Marsh Posté le 24-04-2005 à 18:09:55    

ca devrait surtout etre découpé en 3 parties


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 24-04-2005 à 18:23:46    

Jubijub > vire un peu cet immonde code auto-généré :o
 

Code :
  1. /**
  2. * Created by IntelliJ IDEA.
  3. * User: Jubijub
  4. * Date: 24 avr. 2005
  5. */


 
On vient de dire de ne pas utiliser d'IDE :o
 

Citation :

toute autre méthode utilisant la première méthode doit "catcher" l'exception, c'est à dire utiliser un bloc try/catch/(finally) pour indiquer au programme ce qui doit se passer si une exception est générée. Ce try/catch est obligatoire pour toutes les exceptions, sauf pour les RuntimeException, pour lesquelles il est facultatif.


 
C'est bien entendu incorrect - je suppose que tu as voulu trop simplifier. Il est bien sûr possible et souvent souhaitable de laisser l'exception se propager.
 
Par contre, j'insisterais lourdement sur la pratique à prohiber du catch and burry :

Code :
  1. try {
  2.    ... // code qui peut générer une exception
  3. }
  4. catch (Exception e) {
  5. }


 
C'est acceptable dans des cas tout à fait exceptionnel, et ça s'accompagne toujours d'un commentaire adéquat dans le catch.


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 24-04-2005 à 18:25:36    

ben soit tu la catche, soit tu la throws, mais tu peux pas te contenter d'utiliser la méthode ...mais tu as raison, c pas clair...


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 24-04-2005 à 18:26:33    

sircam a écrit :


C'est bien entendu incorrect - je suppose que tu as voulu trop simplifier. Il est bien sûr possible et souvent souhaitable de laisser l'exception se propager.


 
surtout qu'une NPE, faut deja savoir quoi en faire [:petrus75]


---------------
NP: HTTP Error 764 Stupid coder found
Reply

Marsh Posté le 24-04-2005 à 18:41:02    

Jubijub a écrit :

ben soit tu la catche, soit tu la throws, mais tu peux pas te contenter d'utiliser la méthode ...mais tu as raison, c pas clair...


Disons qu'en précisant, le newb sera sans doute encore plus confus, mais ce sera plus correct.
 
+1 chrisbk -> l'exemple de la NPE pour aborder les exceptions en général n'est pas vraiment adéquat. Les cas de "catch" d'un NPE sont plutôt rares, et certainement à proscrire chez un débutant.
 
Sinon, je vois déjà d'ici :
 

Code :
  1. try {
  2.     foo = myStuff.getValue(); // Fingers crossed; hopes it'll work.
  3. }
  4. catch (NullPointerException npe) {
  5.     myStuff = new Stuff(); // Oops, forgot to instanciate somewhere.
  6. }


 
[:dawa]
 
Edit : sinon, :jap: pour le petit chapitre.


Message édité par sircam le 24-04-2005 à 18:41:30

---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 24-04-2005 à 22:42:02    

Je te livre tel quel ce que j'avais écrit quand j'avais eu le courage de commencer le topic javafaq² et que j'ai jamais pris le temps de continuer :  
 
----
 
Ce topic référence les liens les plus utiles pour la programmation sur Java. Quand vous avez une question, merci de vérifier si la réponse ne se trouve pas à la suite d'un de ces liens
 
1. Les liens pour débutants
 

  • Premiers pas en Java : de l'installation à l'execution d'un HelloWorld
  • Le tutorial Java et un index avec tous les tutoriaux Java de Sun.
  • Le Java Developpement Kit (JDK ou J2SE SDK) v1.4, v1.5 : contient le compilateur et l'environnement d'execution Java (JRE).  [:icon4] ne pas se tromper de lien : "Download J2SE SDK" ou "Download JDK"  
  • La javadoc v1.2, v1.3, v1.4, v1.5. Indispensable. La plupart des réponses se trouvent là !
  • Thinking in Java en anglais et en français : Très bon bounquin, gratuit.
  • Les conventions d'écriture. Très importantes en Java. prenez de bonnes habitudes dès le début :)
  • google. On trouve la réponse à la plupart des questions avec une simple recherche (essayez avec les messages d'erreurs par exemple)


2. FAQ divers
 


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 24-04-2005 à 23:40:20    

Un petit quelque chose sympa et bien expliqué sur la généricité c'est prevu ? (genre avec plein de <? super <? extends E>> )


---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le 24-04-2005 à 23:41:22    

Chronoklazm a écrit :

Un petit quelque chose sympa et bien expliqué sur la généricité c'est prevu ? (genre avec plein de <? super <? extends E>> )


c'est pas trop pour débutant ca ... :/


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 25-04-2005 à 00:28:55    

Chronoklazm a écrit :

Un petit quelque chose sympa et bien expliqué sur la généricité c'est prevu ? (genre avec plein de <? super <? extends E>> )


non, c'est complexe en soi, donc pas d'explication simple.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 25-04-2005 à 10:02:18    

benou a écrit :

Je te livre tel quel ce que j'avais écrit quand j'avais eu le courage de commencer le topic javafaq² et que j'ai jamais pris le temps de continuer :  
 
----
 
Ce topic référence les liens les plus utiles pour la programmation sur Java. Quand vous avez une question, merci de vérifier si la réponse ne se trouve pas à la suite d'un de ces liens
 
1. Les liens pour débutants
 

  • Premiers pas en Java : de l'installation à l'execution d'un HelloWorld
  • Le tutorial Java et un index avec tous les tutoriaux Java de Sun.
  • Le Java Developpement Kit (JDK ou J2SE SDK) v1.4, v1.5 : contient le compilateur et l'environnement d'execution Java (JRE).  [:icon4] ne pas se tromper de lien : "Download J2SE SDK" ou "Download JDK"  
  • La javadoc v1.2, v1.3, v1.4, v1.5. Indispensable. La plupart des réponses se trouvent là !
  • Thinking in Java en anglais et en français : Très bon bounquin, gratuit.
  • Les conventions d'écriture. Très importantes en Java. prenez de bonnes habitudes dès le début :)
  • google. On trouve la réponse à la plupart des questions avec une simple recherche (essayez avec les messages d'erreurs par exemple)


2. FAQ divers
 


 
Je rajouterai  


le premier parce que ;), et le second parce que l'index est bcp plus détaillé


Message édité par Jubijub le 25-04-2005 à 10:03:09

---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 25-04-2005 à 10:11:11    

Benou, merci pour les liens, je mettrai ça à jour dans la journée.
Jubi, pour le truc des exceptions, je pense vraiment qu'un topic à part serait plus approprié.
Pour le nettoyage, je laisse le soin à chacun de voir avec sa conscience (et mon pied dans la gueule) :o


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 25-04-2005 à 10:47:51    

sircam a écrit :

[:dawa] que du fun !


 

elianor a écrit :

merde ! le pilote automatique viens de quitter !!!


 
nan mais dans la réalité :

Code :
  1. public void exit(int status) {
  2. SecurityManager security = System.getSecurityManager();
  3. if (security != null) {
  4.     security.checkExit(status);
  5. }
  6. Shutdown.exit(status);
  7.     }


 
(la clef, c'est "exitVM" ).


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 25-04-2005 à 20:01:41    

Comme on voit assez souvent des erreurs de convention d'écritures dans le code copier/coller de nos débutants , on peut peut-être donner les 3 règles de base :
 
1. Un nom de classe commence toujours par une majuscule.
si la classe comporte plusieurs mots, on alterne majuscule/miniscule :
exemple BindingService
 
2. les variables commencent par une miniscule,exception faite pour les constantes qui sont entièrement en majuscule.
 
3. Une méthode commence toujours par une miniscule.  
si la méthode comporte plusieurs mots, on alterne miniscule/majuscule :
exemple getRelatedData()
 
D'une manière générale évitez  les noms fantaisiste, cherchez à être le plus fonctionnel possible(le couple getXxxx/setXxxx, pour un booléen setXxxx,isXxxx   etc...)
 
Bon c'est basique mais c'est déjà un bon départ pour écrire du code lisible.Pour aller plus loin regarder le lien de Jubijub sur les conventions.
 
En cas j'éditerais pour étoffer un peu ...

Reply

Marsh Posté le 25-04-2005 à 20:36:14    

- Un petit mot aussi sur les immondes mélanges français/anglais, sans mentionner les accents dans les noms de variables.
 
- Comment éviter le piège du main static. Bcp de débutants commencent à taper du code dans la méthode main. Comme le contexte est static, il faut faire appel à des données membres static. Et c'est l'engrenage infernal.
 
Si cette remarque paraît utile, je peux développer.


Message édité par sircam le 25-04-2005 à 20:36:30

---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 25-04-2005 à 21:14:41    

sebi a écrit :

Comme on voit assez souvent des erreurs de convention d'écritures dans le code copier/coller de nos débutants , on peut peut-être donner les 3 règles de base :
 
1. Un nom de classe commence toujours par une majuscule.
si la classe comporte plusieurs mots, on alterne majuscule/miniscule :
exemple BindingService
 
2. les variables commencent par une miniscule,exception faite pour les constantes qui sont entièrement en majuscule.
 
3. Une méthode commence toujours par une miniscule.  
si la méthode comporte plusieurs mots, on alterne miniscule/majuscule :
exemple getRelatedData()


D'autre part, les classes sont des noms communs génériques, les méthodes des verbes (plutôt d'action, sauf "to be" ) les noms des variables sont des noms communs aussi.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 28-04-2005 à 21:32:19    

Ce topic serait-il tombé dans l'oubli ? Tout en bas de la page 3, Wow...
 
Vos commentaires sont les bienvenus, en MP au besoin. J'apporterai les corrections nécessaires sans doute dimanche.

 
Le piège du static void main
 
Alors que j'étais débutant, je suis tombé, comme pas mal d'autres, dans un piège classique qui peut s'avérer très néfaste. Le nainternet n'était pas encore très répandu, je ne fréquentais pas ce forum et je n'ai pas eu la chance de me prendre un bon coup de pelle à clous pour me remettre les idées en place. Résultat : je me suis un peu fâché avec Java avant de revenir à de meilleures considérations, non sans avoir perdu pas mal de temps et avoir dû remettre à plat le peu de connaissances que j'avais acquises.
 
Ami lecteur, je te propose de suivre avec moi le cheminement de ce piège insidieux mais bien réel, et d'en décrypter les mécanismes pour mieux l'éviter.
 
Après avoir potassé le présent tutoriel, bouquiné quelques références et avoir lu avec attention tous les topics proposés, tu commences à te débrouiller et à écrire de petits programmes en Java. Le classpath ne te pose plus trop de problème. Tu as passé le stade du "Hello World" et le nombre de lignes de ton programme devient conséquent.
 
Tu décides de réaliser un premier programme ludique : un jeu de petit bonhomme pendu.
 

Code :
  1. (...)
  2. public class Hangman
  3. {
  4.     public static void main (String [] args)
  5.     {
  6.         private String         playerName;
  7.         private byte           difficultyLevel;
  8.         private String         dictionaryPath;
  9.         private byte           minLetters;
  10.         private byte           maxLetters;
  11.        
  12.         // Plenty of other variables.
  13.        
  14.         // Plenty of lines of code to play the game.
  15.         (...)
  16.     }
  17. )


 
Tout ceci n'est évidemment pas modulaire, outre le fait que l'approche est certainement purement procédurale et peu orientée objet. Tu décides de découper ton programme en petits morceaux, plus modulaires et plus lisibles. Pour ce qui est de l'O.O., on verra plus tard.
 

Code :
  1. (...)
  2. public class Hangman
  3. {
  4.     private static final byte MINIMUM_LETTERS = 2;
  5.     private static final byte MAXIMUM_LETTERS = 16;
  6.    
  7.     private String         playerName;
  8.     private byte           difficultyLevel;
  9.     private String         dictionaryPath;
  10.     private byte           minLetters;
  11.     private byte           maxLetters;
  12.     public Hangman()
  13.     {
  14.         // Do something here.
  15.     }
  16.    
  17.     private void startGame ()
  18.     {
  19.         // Start the game.
  20.     }
  21.    
  22.     private String getRandomWord ()
  23.     {
  24.         // Get a random word from the dicionary.
  25.         (...)
  26.     }
  27.     (...)
  28.        
  29.     public static void main (String [] args)
  30.     {
  31.        // Get game settings from configuration file, ...
  32.        minimumLetters(4);
  33.        playerName("Foo" );
  34.        startGame();
  35.     }
  36. )


 
Outre le côté O.O. qui fait très certainement défaut, mais qui dépasse le cadre de ce tutoriel, une splendide erreur te saute directement au visage, préparant le piège mortel :
 

Code :
  1. non static variable this cannot be referenced from static context


 
Un tentative de supprimer les "this" dans la méthode "main" aboutit à un résultat similaire :
 

Code :
  1. non static variable ___ cannot be referenced from static context


 
Ainsi, une variable "non static" (playerName, difficultyLevel) ne peut pas être référencée depuis un context "static" (la méthode main) ? Qu'à cela ne tienne, rendons ces variables "static", et ça devrait marcher :
 

Code :
  1. (...)
  2. public class Hangman
  3. {
  4.     (...)
  5.        
  6.     static private String         playerName;
  7.     static private byte           difficultyLevel;
  8.     static private String         dictionaryPath;
  9.     static private byte           minLetters;
  10.     static private byte           maxLetters;
  11.    
  12.     (...)
  13. }


 
Cette fois, ça passe pour assigner les variables, mais ça cale sur startGame() :
 

Code :
  1. non-static method startGame() cannot be referenced from static context


 
Encore ce problème de static. Baah, yaka rendre startGame() static elle aussi, non ?
 

Code :
  1. private static void startGame ()


 
Et voilà, ça marche ! Ca te paraît bon ? On laisse le code comme ça ?
 
Si tu as répondu "oui", ou si tu as déjà utiliser un artifice simialire, tu es tombé dans le piège du static main. En rendant une première variable static, tu as continué avec les méthodes de la classe. La gangrène s'est propagée à d'autres classes, car le même problème se posait, si aisément résolu par le mot magique "static".
 
En fait, ton programme est rigoureusement anti-O.O., est très peu modulaire et ne sera pas évolutif. Une véritable horreur. Il n'y a pas le moindre objet dans cette histoire. Nous avons fait un usage incorrect de "static". Ce faisant, chacune des données membres (playerName, minLetters, ...) seront partagées par toutes les instances de la classe. Si je veux intégrer ou réutiliser tout ou partie de ce code, il y a fort à parier que je ne saurai pas en faire grand chose.
 
Mais alors, on m'aurait menti ? Qu'aurais-je dû faire ?
 
- Ne pas utiliser abusivement le mot clé "static" uniquement parce que ça permettait de compiler;
- Déclarer un objet "BonhommePendu" et l'instancier;
- Appeler les méthodes sur cet objet, et non pas sur la classe, comme c'est le cas avec static.
- Accessoirement, ne pas oublier l'adage "touche pas à mes attributs, passe par une de mes méthodes", et ne pas accéder directement aux données membres, mais faire appelle à un accessor.
 
Un exemple vaut mieux qu'un long discours :
 

Code :
  1. (...)
  2. public class Hangman
  3. {
  4.     private static final byte MINIMUM_LETTERS = 2;
  5.     private static final byte MAXIMUM_LETTERS = 16;
  6.    
  7.     private String         playerName;
  8.     private byte           difficultyLevel;
  9.     private String         dictionaryPath;
  10.     private byte           minLetters;
  11.     private byte           maxLetters;
  12.     public Hangman ()
  13.     {
  14.         // Do something here.
  15.     }
  16.    
  17.     public void startGame ()
  18.     {
  19.         // Start the game.
  20.     }
  21.    
  22.     public void setPlayerName (String playerName)
  23.     {
  24.         this.playerName = playerName;
  25.     }
  26.     public String getPlayerName ()
  27.     {
  28.         return playerName;
  29.     }
  30.    
  31.     public void setMinimumLetters (byte minLetters)
  32.     {
  33.        if (minLetters < MINIMUM_LETTERS)
  34.        {
  35.            this.minLetters = MINIMUM_LETTERS;
  36.        }
  37.        else if (minLetters > MAXIMUM_LETTERS)
  38.        {
  39.            this.minLetters = MAXIMUM_LETTERS;
  40.        }
  41.        else
  42.        { 
  43.            this.minLetters = minLetters;
  44.        }
  45.     }
  46.    
  47.     (...)
  48.    
  49.     private String getRandomWord ()
  50.     {
  51.         // Get a random word from the dicionary.
  52.         (...)
  53.     }
  54.      
  55.    
  56.     public static void main (String [] args)
  57.     {
  58.         Hangman hm = new Hangman();
  59.         hm.setMinimumLetters(4);
  60.         hm.setPlayerName("Foo" );
  61.         hm.startGame();
  62.     }
  63. )


 
Et voilà !
 
Bon, c'est pas encore le top au niveau de l'O.O. et de la modularité, et ça n'empêchera pas nraynaud de t'asséner quelques coups de pelles à clous. Mais c'est déjà nettement mieux, et tu viens d'éviter de filer un mauvais coton en O.O. dès le départ et de te prendre une mauvaise habitude. Rassure-toi, Java réserve d'autres surprises, qq soit le niveau.
 
 
 


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 17-05-2005 à 15:58:25    

il y a une version plus recente de think in java, en français
 
voila :)

Reply

Marsh Posté le 31-05-2005 à 14:28:28    

/!\ Merci de ne pas polluer ce topic par des posts hors sujet /!\


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 31-05-2005 à 14:46:20    

un ptit nettoyage? :whistle:


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 01-06-2005 à 17:15:59    

[:icon4] A ma demande, un modérateur va donner un coup de balais à ce topic. Merci de ne pas polémiquer :jap:


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 02-06-2005 à 16:26:55    

nraynaud a écrit :

http://nraynaud.com.free.fr/kilombo/sport_drapal.JPG
 
MAIS ON S4EN FOUT QU4IL COMMENCE PAR UN IDE BORDEL ON EST AU 21ème SIECLE !
 
 
 
 
 
on devrait faire écrire des .class à la main à ceux qui prétendent qu'il faut passer par là.


 
[:plusun], si on est pas sous un IDE, on est pas productif :o

Reply

Marsh Posté le 02-06-2005 à 16:29:33    

il manque l'explication des interfaces, ... quand g t noob en java, venant du C, g t perdu sans mes pointeurs de fonctions :sweat:

Reply

Marsh Posté le 02-06-2005 à 16:31:23    

Giz a écrit :

[:plusun], si on est pas sous un IDE, on est pas productif :o


un débutant, je lui demande pas d'être productif avant de lui demander de comprendre ce qu'il fait.


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 02-06-2005 à 16:32:12    

Giz a écrit :

il manque l'explication des interfaces, ... quand g t noob en java, venant du C, g t perdu sans mes pointeurs de fonctions :sweat:


Poste un bon petit paragraphe bien tassé, 1 ou 2 liens bien foutus, je me ferai un plaisir de mettre les premiers posts à jour :jap:


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 02-06-2005 à 16:37:25    

the real moins moins a écrit :

Poste un bon petit paragraphe bien tassé, 1 ou 2 liens bien foutus, je me ferai un plaisir de mettre les premiers posts à jour :jap:


 
euh, j'ai soulevé le problème ... :whistle: maintenant le faire c'est une autre histoire :D (pb de temps). Sinon je pense qu'il y a moyen de faire un bon copier/coller d'un site sur les interfaces en java, c'est rapide et facile   [:amandine75011]

Reply

Marsh Posté le 02-06-2005 à 21:24:52    

Les interfaces
 
Une interface java est un type de données servant de modèle que des classes peuvent choisir de suivre. On parle alors de classes qui implémentent telle ou telle interface. Une classe peut implémenter plusieurs interfaces. A quoi cela-sert-il ? En définissant une interface, nous pouvons coder des comportements communs à des classes qui à priori n'ont rien en commun. Cela permet également de séparer la spécification du codage à proprement parler.
 
En tant que modèle pur, une interface ne contient pas de code mais uniquement les prototypes des méthodes qu'impose le modèle. Prenons un exemple:
 

Code :
  1. public interface Mangeable
  2. {
  3. public void manger();
  4. public boolean aCuire();
  5. }


 
Nous avons défini une interface "Mangeable". Il y a deux méthodes qui caractérisent l'interface. Vous allez vite comprendre l'interêt par la suite.
 
Parlons implémentation: les classes voulant se plier au modèle "Mangeable" doivent implémenter chacune des méthodes de cette classe, c'est à dire en fournir le code. Rien ne vous empêche par ailleurs de ne pas en metttre (comme c'est le cas dans la famille des classes Adapter de awt.event mais c'est une autre histoire). L'indispensable, c'est à dire ce que le compilateur impose, c'est de redéfinir les méthodes. Imaginons deux classes:
 

Code :
  1. class Patate
  2. {
  3.      private int calibre;
  4.      public boolean estPourrie;
  5.      public Patate(int _calibre, boolean _estPourrie)
  6.      {
  7.           this.calibre = _calibre;
  8.           this.estPourrie = _estPourrie;
  9.      }
  10.      public int  getCalibre()
  11.      {
  12.           return calibre;
  13.      }
  14.      public Frite frire()
  15.      {
  16. [...]
  17.      }
  18.    // etc...
  19. }
  20. class Radis
  21. {
  22.      private int force;
  23.      private boolean estSale;
  24.      public Radis(int _force, boolean _estSale)
  25.      {
  26. [...]
  27.      }
  28.      public int getForce()
  29.      {
  30. return force;
  31.      }
  32.      public void setSale( boolean sel)
  33.      {
  34.         estSale = sel;
  35.      }
  36.      // etc ...
  37. }


 
A priori ces classes n'ont rien en commun niveau codage mais on sent bien qu'elle sont sémantiquement proches ([:neuf]). Laissons opérer la magie des interfaces. Nous allons implémenter l'interface "Mangeable" avec ces deux classes Patate et Radis en utilisant le mot-clé implements, le principal étant de redéfinir les méthodes manger et aCuire.
 
 

Code :
  1. class Patate implements Mangeable
  2. {
  3.      private int calibre;
  4.      public boolean estPourrie;
  5.      public Patate(int _calibre, boolean _estPourrie)
  6.      {
  7.           this.calibre = _calibre;
  8.           this.estPourrie = _estPourrie;
  9.      }
  10.      public Frite frire()
  11.      {
  12. [...]
  13.      }
  14.    // implementation de l'interface Mangeable
  15.      public void manger()
  16.      {
  17.         Frite f = Frire();
  18.         // imaginons que frite implémente Mangeable
  19.         f.manger();
  20.      }
  21.      public boolean aCuire()
  22.      {
  23.         return true;
  24.      }
  25. }
  26. class Radis implements Mangeable
  27. {
  28.      private int force;
  29.      private boolean estSale;
  30.      public Radis(int _force, boolean _estSale)
  31.      {
  32. [...]
  33.      }
  34.      public int getForce()
  35.      {
  36. return force;
  37.      }
  38.      public void setSale( boolean sel)
  39.      {
  40.         estSale = sel;
  41.      }
  42.     // implementation de l'interface Mangeable
  43.      public void manger()
  44.      {
  45.         setSale(true);
  46.      }
  47.      public boolean aCuire()
  48.      {
  49.         return false;
  50.      }
  51. }


 
 
Vous commencez à saisir le truc. En implémentant l'interface "Mangeable" dans ces deux classes, nous en avons fait des sortes de cousines. L'interface étant un type de données au même titre que les classes, nous pouvons écrire des algorithmes souples et élégant avec ces types.  
 
Attention toutefois: une interface ne peu pas s'instancier, cela n'a pas de sens A l'éxecution, ce sont des classes qui implémentent l'interface qui seront utilisées.
 
Nous pouvons imaginer ceci:
 

Code :
  1. class Test
  2. {
  3.     public void mangePresqueTout(Vector v)
  4.     {
  5.         Enumeration e = v.elements();
  6.        
  7.         while ( e.hasMoreElements() )
  8.         {
  9.             Mangeable m = (Mangeable) e.next();
  10.             // on est un peu faineant ^^
  11.             if ( ! m.aCuire() )
  12.             {
  13.                 m.manger();
  14.             }
  15.         }
  16.     }
  17.     public static void main(String [] args)
  18.     {
  19.         Vector menu = new Vector();
  20.         menu.add( new Patate() );
  21.         menu.add( new Radis()  );
  22.        
  23.         mangePresqueTout(menu);
  24.     }
  25. }


 
Et voila :)


Message édité par boulax le 03-06-2005 à 08:34:11

---------------
Posté depuis des chiottes, sales. Me gusta.
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed