Chapitre 1, partie 2 : Références en JAVA

publicité
Chapitre 1 : Langage JAVA
Partie 2 : Références
Université de Sherbrooke
Département de génie électrique et de génie informatique
Notes de cours
GEI 442 : STRUCTURES DE DONNÉES ET ALGORITHMES
Chapitre 1 : Langage JAVA
Partie 2 : Références
Ahmed KHOUMSI
GEI 442 : Structures de données et algorithmes
Hiver 2001
Ahmed KHOUMSI
1
Chapitre 1 : Langage JAVA
Partie 2 : Références
Université de Sherbrooke
Département de génie électrique et de génie informatique
Références
Type de référence = tout type JAVA qui n ’est pas type de base
Variable de type de référence (plus simplement : référence)
Stocke : - adresse mémoire où se trouve un objet (au lieu de valeur d ’objet), ou
- null
Exemple :
100
150
1000
1500
2300
(3 , 7)
(0 , 6)
point1 = 150
point2 = 100
point3 = 150
adresse 100 contient (3, 7)
adresse 150 contient (0, 6)
adresse 1000 contient point1
adresse 1500 contient point2
adresse 2300 contient point3
point1 et point3 sont des variables qui référencent l ’objet qui se trouve à
l ’adresse 150
point2 est une variable qui référence l ’objet qui trouve à l ’adresse 100
Dorénavant : Objet type de base
la différence est la suivante :
- variable de type de base stocke la valeur référencée
- variable de référence stocke l ’adresse de l ’objet référencé
GEI 442 : Structures de données et algorithmes
Hiver 2001
Ahmed KHOUMSI
2
1
Chapitre 1 : Langage JAVA
Partie 2 : Références
Université de Sherbrooke
Département de génie électrique et de génie informatique
Opérations sur références
Modification : à l ’aide de =
Exemple : point1 = point2;
Le contenu de l ’adresse 1500 est copiée dans l ’adresse 1000
Après exécution de l ’instruction, l ’adresse 1000 contient 100
Attention : le contenu de l ’adresse 150 n ’est pas modifié
Comparaison : à l ’aide de == ou !=
Exemple : après modification point1 = point2;
on a : (point1 == point2) qui est true
Différence entre références et pointeurs :
Toute opération autre que celles données ci-dessus est interdite sur des références
Exemple : les deux expressions ci-dessous sont invalides :
point1 * point2
point1 ++
GEI 442 : Structures de données et algorithmes
Hiver 2001
Ahmed KHOUMSI
3
Chapitre 1 : Langage JAVA
Partie 2 : Références
Université de Sherbrooke
Département de génie électrique et de génie informatique
Opérations sur objets référencés
Il y a trois actions de base qui peuvent être effectuées sur un objet référencé :
Conversion de type (déjà vu)
Exemple : type1 x;
type2 y;
…
y = (type) x;
Accès à un champ interne ou Appel d ’une méthode à l ’aide de l ’opérateur “ . ”
Vérifier si un objet est d ’un type donné : à l ’aide de l ’opérateur instanceof
GEI 442 : Structures de données et algorithmes
Hiver 2001
Ahmed KHOUMSI
4
2
Chapitre 1 : Langage JAVA
Partie 2 : Références
Université de Sherbrooke
Département de génie électrique et de génie informatique
Opérateur .
- Permet de choisir une méthode à appliquer à un objet, en spécifiant :
Référence de l ’objet . Nom de la méthode
Exemple : Soit un type Rectangle contenant une méthode surface (sans arguments)
Soit rect une variable qui référence un objet de type Rectangle
On peut calculer la surface de cet objet, comme suit :
double surf;
…
surf = rect.surface();
Si la référence de l ’objet est égale à null, alors l ’utilisation de l ’opérateur “ . ”
génère un NullPointerException lors de l ’exécution du programme
- Permet d ’accéder directement à un champ interne d ’un objet (si accès autorisé)
Exemple : Le type Rectangle contient deux champs largeur et longueur
Soit rect1 et rect2 deux variables qui référencent deux objets de type Rectangle
On peut copier les champs de rect1 dans les champs de rect2, comme suit :
rect2.largeur = rect1.largeur;
rect2.longueur = rect1.longueur;
GEI 442 : Structures de données et algorithmes
Hiver 2001
Ahmed KHOUMSI
5
Chapitre 1 : Langage JAVA
Partie 2 : Références
Université de Sherbrooke
Département de génie électrique et de génie informatique
Déclaration d ’objets
Lorsque variable de type de base déclarée : mémoire allouée pour variable
Lorsque objet déclaré : - mémoire allouée pour référence à l ’objet
- nom fourni pour se référer à l ’objet
Attention : pas de mémoire allouée pour stocker l ’objet
Mémoire allouée pour stocker l ’objet : à l ’aide de l ’opérateur new
Exemple : Soit un type Point qui contient :
- des champs absc et ord
- une méthode positionne
Point p;
/* Alloue mémoire pour stocker référence p initialisée à null */
p = new Point(); /* Alloue mémoire pour stocker objet de type Point
Crée objet de type Point dans la mémoire allouée
p devient référence de l ’objet créé */
p.positionne(x,y); /* Champs absc et ord de l ’objet créé reçoivent x et y */
Remarque : les deux premières instructions peuvent être remplacées par
Point p = new Point();
Si on omet l ’instruction new, alors il y a erreur
GEI 442 : Structures de données et algorithmes
Hiver 2001
Ahmed KHOUMSI
6
3
Chapitre 1 : Langage JAVA
Partie 2 : Références
Université de Sherbrooke
Département de génie électrique et de génie informatique
Affectation et garbage collection
Si x et y sont 2 variables de type de base, alors après l ’instruction x = y;
la valeur stockée dans y est copiée dans x
Si x et y sont 2 variables qui référencent 2 objets, alors après l ’instruction x = y;
- les deux variables vont référencer l ’objet qui était référencé par y
- l ’objet qui était référencé par x ne sera plus référencé par x
Attention : il n ’y a pas de copie d ’un objet sur un autre
Exemple 1 :
Point p = new Point();
Point q = p;
// p et q référencent le même objet
q.positionne(x,y);
// équivalent à p.positionne(x,y)
Exemple 2 : Si on veut avoir deux objets identiques
Point p = new Point();
Point q = new Point();
p.positionne(x,y);
q.positionne(x,y);
Garbage collection : lorsqu ’un objet n ’est plus référencé, alors il est supprimé
GEI 442 : Structures de données et algorithmes
Hiver 2001
Ahmed KHOUMSI
7
Chapitre 1 : Langage JAVA
Partie 2 : Références
Université de Sherbrooke
Département de génie électrique et de génie informatique
Égalité et inégalité
Égalité :
Si x et y sont 2 variables de type de base, alors l ’expression x == y est true
si les valeurs stockées dans x et y sont égales
Si x et y sont 2 variables qui référencent 2 objets, alors l ’expression x == y est true
si x et y référencent le même objet
Attention : x == y est false lorsque x et y référencent deux objets identiques
Les même règles s ’appliquent à !=
Comparaison d ’objets : Comme l ’expression x == y ne permet pas de vérifier si
les deux objets référencés par x et y sont identiques, on peut construire une
méthode equals pour effectuer cette vérification
Exemple : Soient p et q deux objets
p.equals(q) retourne la valeur true ou false
GEI 442 : Structures de données et algorithmes
Hiver 2001
Ahmed KHOUMSI
8
4
Chapitre 1 : Langage JAVA
Partie 2 : Références
Université de Sherbrooke
Département de génie électrique et de génie informatique
Passage d ’arguments
Le passage est effectué par valeur
Si argument de type de base : valeur stockée dans argument est passée
Si argument référence un objet : référence à l ’objet est passée
Attention : objet n ’est pas passé
GEI 442 : Structures de données et algorithmes
Hiver 2001
Ahmed KHOUMSI
9
Chapitre 1 : Langage JAVA
Partie 2 : Références
Université de Sherbrooke
Département de génie électrique et de génie informatique
Strings
JAVA fournit une classe String
Les chaînes de caractères sont manipulées à l ’aide d ’objets de type String
Deux règles fondamentales : qui différencient les String des autres objets
Règle 1 : Un objet String est immuable, càd on ne peut pas le modifier une fois
qu ’on l ’a initialisé
Exemple :
String vide = “”;
/* création de la référence vide et création d’un objet “”
référencé par vide */
String bienvenue = “bonjour”; /* création de la référence bienvenue et
création d’un objet “bonjour” référencé par bienvenue */
String message = bienvenue; /* création de la référence message qui va référencer
l’ objet “bonjour” */
Après ces déclarations, il y a donc deux objets String
1er est référencé par vide; 2ème référencé par bienvenue et message
Les deux objets ne peuvent plus être modifiés. Si on veut que message pointe
sur une nouvelle chaîne “ bonsoir ”, alors il faut d ’abord créer un nouvel objet
String nouveau = “bonsoir”; // création d’un objet “bonsoir” et d’une référence nouveau
message = nouveau;
// ici, il n’y a aucune création, ni de référence ni d’objet
GEI 442 : Structures de données et algorithmes
Hiver 2001
Ahmed KHOUMSI
10
5
Chapitre 1 : Langage JAVA
Partie 2 : Références
Université de Sherbrooke
Département de génie électrique et de génie informatique
Strings (suite)
Règle 2 : On peut appliquer les opérateurs + et += à des Strings pour
concaténer des chaînes de caractères
Exemple : String message1 = “ bonjour ” + “ tout le monde ”;
String message2 = 25 + “
” + “ petits cochons ”;
Remarque : les nombres ne sont pas obligatoirement entre guillemets
On peut aussi utiliser +=
a +=b est équivalent à a = a + b
GEI 442 : Structures de données et algorithmes
Hiver 2001
Ahmed KHOUMSI
11
Chapitre 1 : Langage JAVA
Partie 2 : Références
Université de Sherbrooke
Département de génie électrique et de génie informatique
Comparaison des chaînes
À part les opérateurs de concaténation, les Strings sont manipulés comme
les autres objets. Par exemple, on ne peut pas comparer deux objets à l ’aide
de l ’opérateur ==
Exemple : String a = “ bonjour ”;
String b = “ bonjour ”;
a == b est false car a et b ne référencent pas le même objet
Les objets de type String peuvent être comparés à l’aide de deux méthodes :
equals
qui retourne true ou false
compareTo qui retourne un nombre négatif, nul ou positif, selon une
comparaison lexicographique
Exemple : String a = “ bonjour ”;
String b = “ bonsoir ”;
a.equals(b);
// retourne false car contenus des chaînes différents
a.compareTo(b); // retourne un nombre négatif
GEI 442 : Structures de données et algorithmes
Hiver 2001
Ahmed KHOUMSI
12
6
Chapitre 1 : Langage JAVA
Partie 2 : Références
Université de Sherbrooke
Département de génie électrique et de génie informatique
Autres méthodes de String
length permet d ’obtenir longueur d ’une chaîne
Exemple : String a = “ hello ”;
a.length(); // retourne 5
CharAt permet de récupérer un caractère particulier en spécifiant sa position
(1er caractère est à la position 0)
Exemple : String a = “ hello ”;
a.CharAt(4); // retourne le caractère o
Substring permet de récupérer une sous-chaîne, en spécifiant les positions
de début et de fin
Exemple : String a = “ hello ”;
a.Substring(1,3); // retourne la sous-chaîne “ ell ”
GEI 442 : Structures de données et algorithmes
Hiver 2001
Ahmed KHOUMSI
13
Chapitre 1 : Langage JAVA
Partie 2 : Références
Université de Sherbrooke
Département de génie électrique et de génie informatique
Conversions entre Strings et types de base
Méthode toString permet de convertir un type de base en un String
Exemple : toString(13); /* crée un objet “ 13 ” de type String
retourne une référence à l ’objet créé */
Plusieurs classess possèdent une méthode toString permettant de convertir
certains arguments en des String
Exemple : Classe Integer
String a = Integer.toString(27);
Certaines classes possèdent des méthodes inverses de toString
Exemple : int x = Integer.parseInt(“27”);
GEI 442 : Structures de données et algorithmes
Hiver 2001
Ahmed KHOUMSI
14
7
Chapitre 1 : Langage JAVA
Partie 2 : Références
Université de Sherbrooke
Département de génie électrique et de génie informatique
Tableaux (Array)
En JAVA, un tableau se comporte comme un objet
Si a est un tableau, on peut alors accéder à ses composants en spécifiant
un indice positif ou nul : a[0], a[1] ...
Longueur d ’un tableau a : a.length
Déclaration d ’un tableau : pas de mémoire allouée pour stocker le tableau
Exemple :
int [ ] a;
/* Mémoire allouée uniquement pour stocker
référence à un tableau d ’entiers */
a = new int [ 50 ]; /* Mémoire allouée pour stocker tableau de 50 entiers.
Cette mémoire est référencée par a */
Deux manières de déclarer et allouer mémoire pour tableau
- int [ ] a = new int [ 5 ];
// déclaration d ’un tableau de 5 entiers
- int [ ] a = { 1, 2, 5, 7, 8}; // déclaration et initialisation d ’un tableau de 5 entiers
Les composants d ’un tableau peuvent être :
- de types de base
- des objets
GEI 442 : Structures de données et algorithmes
Hiver 2001
Ahmed KHOUMSI
15
Chapitre 1 : Langage JAVA
Partie 2 : Références
Université de Sherbrooke
Département de génie électrique et de génie informatique
Exemple d ’utilisation de tableau
(Fig 2.3 dans [1])
import Supporting.Random;
public class Lottery
{
// Generate lottery numbers (from 1-49)
// Print number of occurrences of each number
public static final int DIFF_NUMBERS
=
49;
public static final int NUMBERS_PER_GAME =
6;
public static final int GAMES
= 1000;
public static void main( String [ ] args )
{
// Generate the numbers
int [ ] numbers = new int [ DIFF_NUMBERS + 1 ];
for( int i = 0; i < numbers.length; i++ )
numbers[ i ] = 0;
Random r = new Random( );
for( int i = 0; i < GAMES; i++ )
for( int j = 0; j < NUMBERS_PER_GAME; j++ )
numbers[ r.randomInt( 1, DIFF_NUMBERS ) ]++;
// Output the summary
for( int k = 1; k <= DIFF_NUMBERS; k++ )
System.out.println( k + ": " + numbers[ k ] );
}
}
GEI 442 : Structures de données et algorithmes
Hiver 2001
Ahmed KHOUMSI
16
8
Chapitre 1 : Langage JAVA
Partie 2 : Références
Université de Sherbrooke
Département de génie électrique et de génie informatique
Exemple d ’utilisation de tableau
(suite)
Constantes :
- Nombre de numéros possibles (DIFF_NUMBERS) = 49
- Nombre de numéros tirés par jeu (NUMBERS_PER_GAME) = 6
- Nombre de jeux (GAMES) = 1000
Ligne 15 : Déclare et alloue mémoire pour tableau numbers de 50 entiers
Lignes 16, 17 : Initialise à 0 les éléments du tableau
Ligne 19 : Déclare et alloue mémoire pour objet r, de type Random
Cet objet permet de générer des nombres aléatoirement
Lignes 21, 22, 23 : On effectue 1000 jeux (ligne 21)
Dans chaque jeu, on tire 6 numéros (ligne 22)
À la position i du tableau numbers, il y a le nombre de fois où le numéro i
a été tiré
GEI 442 : Structures de données et algorithmes
Hiver 2001
Ahmed KHOUMSI
17
Chapitre 1 : Langage JAVA
Partie 2 : Références
Université de Sherbrooke
Département de génie électrique et de génie informatique
Tableaux (Array)
Copie de tableaux
Comme un tableau est un objet, on ne peut pas copier un tableau à l ’aide de =
Exemple : int [ ] a = new int [ 100 ]; /* création d ’une référence a et création d ’un objet
tableau de taille 100 référencé par a */
int [ ] b = new int [ 100 ]; /* création d ’une référence b et création d ’un objet
tableau de taille 100 référencé par b */
a = b; /* a et b référencent le même objet, qui était référencé par b
l ’objet qui était référencé par a n ’est alors plus référencé,
il sera donc supprimé par le garbage collection */
Copie de tableau peut être faite à l ’aide d ’une méthode clone
Exemple : a.clone(b); /* crée objet b de même dimension et type que a
copie a[i] dans b[i], pour i = 0 à a.length-1 */
Passage d ’arguments tableau
- c ’est la référence au tableau qui est passée
- une méthode peut donc modifier un tableau qui lui est passé en argument
GEI 442 : Structures de données et algorithmes
Hiver 2001
Ahmed KHOUMSI
18
9
Chapitre 1 : Langage JAVA
Partie 2 : Références
Université de Sherbrooke
Département de génie électrique et de génie informatique
Expansion dynamique d ’un tableau
Si on a un tableau de taille u et qu ’on veut agrandir sa taille à v (v > u), alors
on peut procéder comme suit :
int [ ] a = new int [ u ]; // création tableau de u entiers référencé par a
…
int [ ] c = a;
// tableau initial référencé par a et c
a = new int [ v ];
// a référence un nouveau tableau de taille v > u
for (int i=0; i <u; i++) /* copie du tableau initial dans les u premiers
a[i] = c[i];
emplacements du nouveau tableau */
c = null;
/* le tableau initial n ’est plus référencé est sera donc
supprimé par le garbage collection */
GEI 442 : Structures de données et algorithmes
Hiver 2001
Ahmed KHOUMSI
19
Chapitre 1 : Langage JAVA
Partie 2 : Références
Université de Sherbrooke
Département de génie électrique et de génie informatique
Tableaux multidimensionnels
On peut déclarer un tableau de 2, 3, … dimensions
Exemple :
int [ ] [ ] x = new int [ 5 ] [ 10 ]; // création d ’un tableau de 5*10 entiers */
double [ ] [ ] [ ] x = new double [ 5 ] [ 10 ] [ 100 ];
// création d ’un tableau de 5*10*100 flottants
GEI 442 : Structures de données et algorithmes
Hiver 2001
Ahmed KHOUMSI
20
10
Chapitre 1 : Langage JAVA
Partie 2 : Références
Université de Sherbrooke
Département de génie électrique et de génie informatique
Arguments d ’une commande
Les arguments d ’une commande correspondent aux arguments
args [ 0 ], args [ 1 ], … du main
Exemple : soit la classe Echo définie ci-dessous (Fig 2.5 dans [1])
public class Echo
{
public static void main( String [ ] args )
{
for( int i = 0; i < args.length - 1; i++ )
System.out.print( args[ i ] + " " );
if( args.length != 0 )
System.out.println( args[ args.length - 1 ] );
else
System.out.println( "No arguments to echo" );
}
}
Si on exécute la commande java Echo bonjour bye
le main de la classe Echo est exécuté avec :
args.length égal à 2
args [ 0 ]
égal à “bonjour”
args [ 1 ]
égal à “bye”
GEI 442 : Structures de données et algorithmes
Hiver 2001
Ahmed KHOUMSI
21
Chapitre 1 : Langage JAVA
Partie 2 : Références
Université de Sherbrooke
Département de génie électrique et de génie informatique
Gestion des exceptions : clauses try et catch
Exceptions sont des objets utilisés pour prendre en compte des situations
exceptionnelles (généralement des erreurs)
try : Le code dans lequel une exception peut se produire est mis dans un bloc try
try
{
/* code */
}
catch : Bloc (s) juste après le bloc try
Un bloc catch est associé à une exception donnée
catch ( Exception e)
{
/* code */
}
Lorsqu ’une exception se produit dans le bloc try , alors :
- un saut est effectué vers bloc (s) catch
- les blocs catch sont vérifiés un après l ’autre jusqu ’à ce qu ’on
trouve un bloc correspondant à l ’exception
- le code du bloc catch (si un tel bloc est trouvé) est exécuté
GEI 442 : Structures de données et algorithmes
Hiver 2001
Ahmed KHOUMSI
22
11
Chapitre 1 : Langage JAVA
Partie 2 : Références
Université de Sherbrooke
Département de génie électrique et de génie informatique
import java.io.*;
Exemple d ’utilisation de try et catch
public class DivideByTwo
(Fig 2.6
{
public static void main( String [ ] args )
{
BufferedReader in = new BufferedReader( new
InputStreamReader( System.in ) );
int x;
String oneLine;
dans [1])
System.out.println( "Enter an integer: " );
try {
oneLine = in.readLine( );
x = Integer.parseInt( oneLine );
System.out.println( "Half of x is " + ( x / 2 ) );
}
catch( Exception e ) { System.out.println( e ); }
}
}
Dans le bloc try (lignes 14 à 19) :
- l ’exception IOException peut être générée par la méthode readline de la classe
BufferedReader (voir [2] page 284)
- l ’exception NumberFormatException peut être générée par la méthode
parseInt de la classe Integer (voir [2] page 350)
Le bloc catch est exécuté pour les deux exceptions car il est associé à l ’exception
parent Exception (voir [2], Fig. 11.2 et 12.2, pages 282 et 330)
GEI 442 : Structures de données et algorithmes
Hiver 2001
Ahmed KHOUMSI
23
Chapitre 1 : Langage JAVA
Partie 2 : Références
Université de Sherbrooke
Département de génie électrique et de génie informatique
Types d ’exceptions
L ’exception parent de toutes les exceptions s ’appelle Exception
Toute autre exception hérite de Exception, sur une ou plusieurs générations
Voir [2] :
- page 249, pour les exceptions du package java.beans
- page 282, pour les exceptions du package java.io
- page 330, pour les exceptions du package java.lang
D ’autres exceptions sont présentées dans la version précédente de [2]
(java 1.1) :
- page 280, pour les exceptions du package java.awt
- page 335, pour les exceptions du package java.awt.datatransfer
GEI 442 : Structures de données et algorithmes
Hiver 2001
Ahmed KHOUMSI
24
12
Chapitre 1 : Langage JAVA
Partie 2 : Références
Université de Sherbrooke
Département de génie électrique et de génie informatique
Gestion d ’exceptions : clause finally
Un bloc finally peut être ajouté après les blocs catch
Après : exécution (d ’une partie) du bloc try et
exécution (éventuelle) d ’un bloc catch
Le bloc finally est exécuté
Remarque : le bloc finally est exécuté même si aucun bloc catch n ’est exécuté
Le bloc finally permet, par exemple, d ’effectuer certains « nettoyages » qui
normalement sont effectués dans le bloc try lorsqu ’aucune exception n ’a lieu.
Ces nettoyages pourraient être mis dans les blocs catch, mais il n ’est pas
garanti qu ’un bloc catch sera toujours exécuté lorsqu ’une exception est jetée.
Exemples de scénarios :
- Si bloc try s ’exécute sans exception :
alors exécution du bloc finally
- Si exception générée dans bloc try et n ’a pas de bloc catch correspondant :
alors bloc finally s ’exécute et l ’exception est propagée
- Si exception générée dans bloc try et attrapée dans bloc catch :
alors blocs catch et ensuite finally exécutés
GEI 442 : Structures de données et algorithmes
Hiver 2001
Ahmed KHOUMSI
25
Chapitre 1 : Langage JAVA
Partie 2 : Références
Université de Sherbrooke
Département de génie électrique et de génie informatique
Gestion d ’exceptions : clause throw
La clause throw permet de générer une exception
Exemple : throw new Exception ( “ problème ! ” );
On peut générer une exception connue
On peut aussi :
- définir de nouvelles exceptions qui héritent de Exception
- générer ces nouvelles exceptions
Un exemple vous sera distribué
GEI 442 : Structures de données et algorithmes
Hiver 2001
Ahmed KHOUMSI
26
13
Chapitre 1 : Langage JAVA
Partie 2 : Références
Université de Sherbrooke
Département de génie électrique et de génie informatique
Gestion d ’exceptions : clause throws
Soit une méthode m dans laquelle une exception est jetée, à l ’aide de throw
Il y a les deux cas suivants à considérer :
1) l ’exception est : - jetée dans un bloc try et
- attrapée par un bloc catch
2) l ’exception : - n ’est pas générée dans un bloc try
(elle ne pourra donc pas être attrapée par un bloc catch) ou
- est générée dans un bloc try mais n ’est pas attrapée par
un bloc catch
Dans le second cas, la méthode m doit propager explicitement l ’exception,
pour que toute autre méthode n qui appelle la méthode m sache qu ’elle doit :
- soit traiter l ’exception en : - mettant l ’appel de m dans un bloc try et
- attraper l ’exception par un bloc catch
- soit propager elle aussi l ’exception pour toute méthode qui appellerait n
L ’exception : - est propagée à l ’aide de la clause throws
- sera en fin de compte traitée, car elle ne peut pas être propagée par
le main
GEI 442 : Structures de données et algorithmes
Hiver 2001
Ahmed KHOUMSI
27
Chapitre 1 : Langage JAVA
Partie 2 : Références
Université de Sherbrooke
Département de génie électrique et de génie informatique
Exemple d ’utilisation de throw et throws
import java.io.*;
public class ThrowDemo
{
public static void processFile( String toFile )
throws IOException
{
// Omitted implementation propagates all
// thrown IOException back to the caller
}
public static void main( String args[ ] )
{
for ( int i = 0; i < args.length; i++ )
{
try
{ processFile( args[ i ] ); }
catch( IOException e )
{ System.err.println( e ); }
}
}
}
GEI 442 : Structures de données et algorithmes
Hiver 2001
Ahmed KHOUMSI
28
14
Chapitre 1 : Langage JAVA
Partie 2 : Références
Université de Sherbrooke
Département de génie électrique et de génie informatique
Entrées et sorties
Il faut faire appel au package java.io à l ’aide de l ’instruction import java.io.*
Opérations de base
On utilise la classe System (voir [2], page 369) qui possède trois champs :
- System.in
de type InputStream (voir [2], page 299)
- System.out
de type PrintStream (voir [2], page 315)
- System.err
System.in représente l ’entrée standard
System.out représente la sortie standard
System.err représente la sortie standard d ’erreurs
Écriture : On peut imprimer à l ’aide de :
System.out.println
System.err.println
(voir [2], page 428)
Lecture : Pour lire une ligne, on peut utiliser la méthode readline d ’un
objet BufferedReader (voir [2], page 284)
BufferedReader est construit à partir d ’un objet InputStreamReader
(voir [2], page 300)
GEI 442 : Structures de données et algorithmes
Hiver 2001
29
Chapitre 1 : Langage JAVA
Partie 2 : Références
Université de Sherbrooke
Département de génie électrique et de génie informatique
import java.io.*;
Ahmed KHOUMSI
Entrées et sorties
public class DivideByTwo
(exemple, Fig. 2.6 dans
{
public static void main( String [ ] args )
{
BufferedReader in = new BufferedReader( new
InputStreamReader( System.in ) );
int x;
String oneLine;
[1])
System.out.println( "Enter an integer: " );
try {
oneLine = in.readLine( );
x = Integer.parseInt( oneLine );
System.out.println( "Half of x is " + ( x / 2 ) );
}
catch( Exception e ) { System.out.println( e ); }
}
}
Lecture : - lignes 8,9 : création d ’un objet de type BufferedReader
- ligne 16 : lecture d ’une ligne : in.readline() retourne un String
- ligne 17 : convertit le String en un entier
Écriture : System.out.println utilisé dans les lignes 13, 18 et 21
GEI 442 : Structures de données et algorithmes
Hiver 2001
Ahmed KHOUMSI
30
15
Chapitre 1 : Langage JAVA
Partie 2 : Références
Université de Sherbrooke
Département de génie électrique et de génie informatique
Analyse lexicale d ’un String
Dans l ’exemple précédent, on a vu comment convertir un String en un entier
Cette conversion n ’est applicable que si le String contient un seul entier
Lorsque le String contient plusieurs items, on peut utiliser un objet de
type StringTokenizer (voir [2], page 535) qui permet de séparer les items
Pour cela, il faut faire appel au package java.util à l ’aide de l ’instruction
import java.util.*;
GEI 442 : Structures de données et algorithmes
Hiver 2001
31
Chapitre 1 : Langage JAVA
Partie 2 : Références
Université de Sherbrooke
Département de génie électrique et de génie informatique
import java.io.*;
import java.util.*;
Ahmed KHOUMSI
Analyse lexicale d ’un String
(exemple, Fig. 2.10 dans [1])
public class MaxTest
{
public static void main( String args[ ] )
{
BufferedReader in = new BufferedReader( new InputStreamReader( System.in ) );
String oneLine;
StringTokenizer str;
int x;
int y;
System.out.println( "Enter 2 ints on one line: " );
try {
oneLine = in.readLine( );
str = new StringTokenizer( oneLine );
if( str.countTokens( ) != 2 )
throw new NumberFormatException( );
x = Integer.parseInt( str.nextToken( ) );
y = Integer.parseInt( str.nextToken( ) );
System.out.println( "Max: " + Math.max( x, y ) );
}
catch( Exception e ) { System.err.println( "Error: need two ints" ); }
}
}
Ligne 19 : Création d ’un objet str de type StringTokenizer à partir du String lu
Ligne 20 : str.countokens() retourne le nombre d ’items qu ’il y a dans str
Lignes 20, 21 : Exception générée s ’il n ’y a pas deux items
Lignes 22, 23 : Les deux items convertis en deux entiers x et y
GEI 442 : Structures de données et algorithmes
Hiver 2001
Ahmed KHOUMSI
32
16
Chapitre 1 : Langage JAVA
Partie 2 : Références
Université de Sherbrooke
Département de génie électrique et de génie informatique
Entrée sur un fichier séquentiel
Cette fois aussi, on utilise un objet de type BufferedReader
Mais au lieu de le construire à partir de InputStreamReader, on le construit
à partir de FileReader
Dans l ’exemple de la page suivante :
- ligne 20 : Création d ’un objet de type FileReader à partir du nom du fichier
fileName
- ligne 21 : Création d ’un objet fileIn de type BufferedReader à partir de l ’objet
theFile
- lignes 31, 32 : Le fichier est fermé avant de sortir
GEI 442 : Structures de données et algorithmes
Hiver 2001
Ahmed KHOUMSI
Chapitre 1 : Langage JAVA
Partie 2 : Références
Université de Sherbrooke
Département de génie électrique et de génie informatique
import java.io.*;
33
Entrée sur un fichier séquentiel
public class ListFiles
(exemple,
{
public static void main( String [ ] args ) {
if( args.length == 0 )
System.out.println( "No files specified" );
for( int i = 0; i < args.length; i++ )
listFile( args[ i ] );
}
public static void listFile( String fileName )
FileReader theFile;
BufferedReader fileIn = null;
String oneLine;
Fig. 2.11 dans [1])
{
System.out.println( "FILE: " + fileName );
try {
theFile = new FileReader( fileName );
fileIn = new BufferedReader( theFile );
while( ( oneLine = fileIn.readLine( ) ) != null )
System.out.println( oneLine );
}
catch( Exception e ) { System.out.println( e ); }
// Close the stream
try {
if(fileIn != null )
fileIn.close( );
}
catch( IOException e ) { }
}
}
GEI 442 : Structures de données et algorithmes
Hiver 2001
Ahmed KHOUMSI
34
17
Téléchargement