III) ELEMENTS DE PROGRAMMATION
3) Structures de contrôle et expressions
Les mêmes qu'en C et C++ (if, switch, for, while, do while, ++, +=, &&,
&, <<, ?: ) + blocs labelisés
+ <<< (décalage droite sans extension de signe) + instanceof
+ exceptions - goto.
3-1) Les blocs labelisés
Cest un peu comme en C, si vous lisez le K & R du C vous y trouverez
au chapitre sur les labels une réflexion
qui sapparente à : « Existe mais ne pas utiliser ». Cette
remarque vielle de trente ans reste valable même pour
Java. Toutefois sil existe quelques irréductibles codeurs qui souhaitent
brouiller la lisibilité de leur code et
augmenter les risques derreurs et deffets de bords désastreux
voici un petit exemple qui fonctionne très bien.
un: while ( ...)
{
deux: for(...)
{
trois: while (...)
{
if (...)
continue un; // Reprend sur la premiere boucle while
if (...) break deux; // Quitte la boucle for
continue; //Reprend sur deuxieme boucle while (trois)
}
}
}
3-2) L'opérateur
instanceof
L'opérateur instanceof peut être utilisé pour vérifier
la classe d'un objet dynamiquement.
Boolean test;
String str = "toto";
test = (str instanceof String); // true
3-3) Les exceptions
Le mécanisme d'exception permet de séparer le flot de contrôle
classique (retour de fonction avec valeur) du flot
de contrôle lié à un comportement exceptionnel (erreurs, ...).
Java est conçu de sorte que la gestion derreur soit
simple et dénuée de toute ambiguïté (pas comme en C++
où chacun à sa propre « recette de cuisine »).
Une exception est une instance d'une classe dérivant de la classe java.lang.Exception.
Une levée d'exception est due à un appel à la primitive throw
ou à une méthode ayant elle-même levé
l'exception :
throw new Exception();
La levée d'une exception provoque une remontée dans l'appel des
méthodes jusqu'à ce qu'une méthode possédant
un bloc try/catch récupérant cette classe d'exception soit trouvée.
try
{
// code pouvant provoquer des IOException, FileNotFoundException ou des
SecurityException
}
catch(IOException e)
{
// Gestion des IOExceptions et de
//ses sous classes (FileNotFoundException, ...)
}
catch(SecuritytException e)
{
// Gestion des SecurityException
}
finally
{
//code exécuté quel que soit la nature de l'exception
}
L'appel à une méthode pouvant lever une exception doit :
??soit être contenu dans un bloc try/catch ;
??soit être situé dans une méthode propageant (throws) cette
classe d'exception.
public static void main(String argv[]) throws Exception
Un bloc (optionnel) finally peut être posé à la suite des
catch. Son contenu est exécuté quelle que soit la
façon dont s'exécute le bloc try.
Figure 4 : schéma du flot de contrôle lié aux exceptions
3-4) Les variables
Les variables en Java peuvent être de "trois" sortes de types
:
_primitifs ;
_référence à un objet ;
_référence à un tableau.
Toute variable locale doit être initialisée explicitement avant de
pouvoir utiliser sa valeur (vérification statique
par le compilateur).
Les variables peuvent être déclarées n'importe où dans
un bloc ({...}).
Deux variables « locales » (locales et paramètres) de deux
blocs imbriqués l'un dans l'autre ne peuvent pas avoir
le même nom.
Il n'existe pas de pointeur en Java.
3-5) Les types primitifs
Tableau 2 : les types primitifs de Java
Tous les types numériques (byte inclus) sont signés.
Il n'existe pas de transtypage (cast) implicite avec perte d'information pour
les types primitifs, afin déviter des
bugs, le compilateur génère une erreur à la compilation :
int i = 130;
long l = i; // ok
byte b = 130; // erreur
byte b = i; // erreur
byte b = (byte) i; // ok mais b = -126
Le calcul en réels sécurisé :
double b;
double c=1;
b=(1-c)/(1-c);
System.out.println(""+ b ); // NaN
b=-1/(1-c);
System.out.println(""+ b ); // -Infinity
b=Double.MAX_VALUE*Double.MAX_VALUE/(1-c);
System.out.println(""+ b ); // Infinity
Les paramètres de types primitifs ne sont pas des objets. Il existe des
classes enveloppes associées aux types
primitifs (Boolean, Byte, Character, Short, Integer, Long, Float et Double) pour
permettre de
manipuler les nombres comme des objets. Toutes ces classes ont des méthodes
*Value décrites dans la classe
Number permettant de récupérer la valeur dans le type primitif *
correspondant.
Integer i = new Integer(1);
int j = i.intValue();
L'ensemble des fonctions de la bibliothèque mathématique sont disponibles
dans le package java.lang.Math
: random, abs, sin, co, tan, sqrt, min, max, log, exp...
3-6) Les références
Variable permettant de stocker la référence à un objet.
Circle c;
L'affectation (Circle cercle=c) ne fait pas une copie de l'objet : cercle et c
font référence au même objet.
Contrairement au C++ aucun objet n'est créé lors de la déclaration.
Le nom de la classe est le type de la référence
pas celui de l'objet. Le type de la référence sert lors des vérifications
de type du compilateur. Il n'existe pas de
transtypage implicite avec perte d'informations. Un transtypage forcé peut
lever une ClassCastException.
|
|
|
|
|
|
|
|
|
|
© 2001 IsepFAQtory Tous droits réservés
|
|