Exercices en Java (10-Traitement des exceptions)

Sébastien ESTIENNE

Ce dixième chapitre aborde le traitement des exceptions.
Le premier exercice s'intéresse à la saisie d'un entier par un utilisateur dans une boîte de dialogue. Le deuxième exercice concerne la division par zéro illustrant la création de nouvelles exceptions. Le troisième exercice montre le fonctionnement des exceptions. Le dernier exercice porte sur la saisie de longueurs appliquée à la saisie de ses dimensions.

Les principales notions abordées sont les suivantes :

- Bloc try / Catch ;

- Lancer une exception (throw) ;

- Capturer une exception (catch) ;

- Bloc Finally ;

- Clause throws ;

- Créer des exceptions personnalisées ;

- Pile d'appels de méthodes (printStackTrace).

Pour faire et comprendre ces exercices, vous aurez besoin d'un certain nombre de notions sur le langage Java en rapport avec le chapitre. Pour cela, vous pouvez consulter les tutoriels Java de developpez à l'adresse suivante : https://java.developpez.com/cours/

La documentation de l'API sur le site de Sun est aussi une mine d'or : http://java.sun.com/javase/6/docs/api/ ♪

- Titre : Exercices en Java (10-Traitement des exceptions)

- Auteur : Sébastien ESTIENNE

- Parution : 27 janvier 2010

- Mise à jour : 2 mars 2010

- Licence : Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2010 Sébastien ESTIENNE. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Saisie d'un entier

- I-1. Énoncé

- I-2. Aperçu

- I-3. Démonstration

- I-4. Solution

- II. Division par zéro

- II-1. Énoncé

- II-2. Aperçu

- II-3. Démonstration

- II-4. Solution

- III. Fonctionnement des exceptions

- III-1. Énoncé

- III-2. Aperçu

- III-3. Démonstration

- III-4. Solution

- IV. Saisie de longueurs

- IV-1. Énoncé

- IV-2. Aperçu

- IV-3. Démonstration

- IV-4. Solution

- V. Remerciements

I - Saisie d'un entier

I-1 - Énoncé

Écrivez une application qui demande à l'utilisateur de saisir un entier à l'aide d'une boîte de dialogue. Tant que la valeur saisie est incorrecte, affichez un message d'erreur et demandez à nouveau la saisie. Si la valeur est correcte, affichez un message de confirmation.
Note : Utilisez un bloc try / catch avec l'exception NumberFormatException.

Classes de l'API utilisées :

- javax.swing.JOptionPane

I-2 - Aperçu

Aperçu du résultat.

I-3 - Démonstration

Lancer avec Java Web Start

Note : javaws -viewer (accessible également depuis le panneau de configuration Java) permet de voir les différentes applications JWS en cache et de les gérer.

I-4 - Solution

SaisieEntier.java

1. /*

2. * Fichier: SaisieEntier.java

3. * Crée le: 21 juin 2007.

4. * Modifié: 21 février 2009.

5. * Auteurs: Sébastien ESTIENNE.

6. * SiteWeb: http://www.prog-info.org/

7. *

8. * This program is free software; you can redistribute it and/or modify

9. * it under the terms of the GNU General Public License as published by

10. * the Free Software Foundation; either version 2 of the License, or

11. * (at your option) any later version.

12. *

13. * This program is distributed in the hope that it will be useful,

14. * but WITHOUT ANY WARRANTY; without even the implied warranty of

15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

16. * GNU General Public License for more details.

17. *

18. * You should have received a copy of the GNU General Public License

19. * along with this program; if not, write to the Free Software

20. * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

21. */

23. package chapitre10;

27. import javax.swing.JOptionPane;

31. /**

32. * <p>Classe illustrant le principe des exceptions par la saisie d'un entier.</p>

33. * @author Sébastien ESTIENNE.

34. */

35. public class SaisieEntier

36. {

37. /**

38. * <p>Lance l'application.</p>

39. * @param args Les paramètres de la ligne de commande.

40. */

41. public static void main(String[] args)

42. {

43. // Indique si la valeur saisie est valide ou non.

44. boolean estValide = false;

46. // La valeur de l'entier saisi.

47. int entier = 0;

49. // Demande un entier à l'utilisateur tant que la saisie est invalide.

50. String sEntier = null;

51. while(!estValide)

52. {

53. // Demande la saisie d'un entier et essai de le convertir.

54. sEntier = JOptionPane.showInputDialog(null, "Saisissez un entier : ", "Entier",

55. JOptionPane.QUESTION_MESSAGE);

56. try

57. {

58. entier = Integer.parseInt(sEntier);

59. estValide = true;

60. }

61. // Affiche un message d'erreur si la saisie n'est pas un entier.

62. catch(NumberFormatException e)

63. {

64. JOptionPane.showMessageDialog(null, "La valeur saisie n'est pas un entier.", "Erreur",

65. JOptionPane.ERROR_MESSAGE);

66. }

67. }

69. // Affiche le résultat.

70. JOptionPane.showMessageDialog(null, "Vous avez saisi l'entier : " + entier, "Résultat",

71. JOptionPane.INFORMATION_MESSAGE);

72. }

73. }

II - Division par zéro

II-1 - Énoncé

Écrivez un programme contenant une classe d'exception de division par zéro héritant de la classe ArithmeticException ainsi qu'une classe permettant de tester cette exception.
Cette classe de test est une application graphique contenant des étiquettes et des champs pour le numérateur, le dénominateur et le quotient. Le programme doit afficher un message d'erreur lorsqu'une des valeurs saisies n'est pas un entier ou encore lorsque le dénominateur vaut zéro.

Classes de l'API utilisées :

- java.awt.Container

- java.awt.GridLayout

- java.awt.event.ActionEvent

- java.awt.event.ActionListener

- java.text.DecimalFormat

- javax.swing.JFrame

- javax.swing.JLabel

- javax.swing.JOptionPane

- javax.swing.JTextField

II-2 - Aperçu

Aperçu du résultat.

II-3 - Démonstration

Lancer avec Java Web Start

Note : javaws -viewer (accessible également depuis le panneau de configuration Java) permet de voir les différentes applications JWS en cache et de les gérer.

II-4 - Solution

division/DivisionParZeroException.java

1. /*

2. * Fichier: DivisionParZeroException.java

3. * Crée le: 21 juin 2007.

4. * Modifié: 7 juillet 2007.

5. * Auteurs: Sébastien ESTIENNE.

6. * SiteWeb: http://www.prog-info.org/

7. *

8. * This program is free software; you can redistribute it and/or modify

9. * it under the terms of the GNU General Public License as published by

10. * the Free Software Foundation; either version 2 of the License, or

11. * (at your option) any later version.

12. *

13. * This program is distributed in the hope that it will be useful,

14. * but WITHOUT ANY WARRANTY; without even the implied warranty of

15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

16. * GNU General Public License for more details.

17. *

18. * You should have received a copy of the GNU General Public License

19. * along with this program; if not, write to the Free Software

20. * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

21. */

23. package chapitre10.division;

27. /**

28. * <p>Classe d'exception pour la division par zéro.</p>

29. * @author Sébastien ESTIENNE.

30. */

31. public class DivisionParZeroException extends ArithmeticException

32. {

33. /**

34. * <p>Serial version UID.</p>

35. */

36. private static final long serialVersionUID = 1L;

39. /**

40. * <p>Constructeur spécifiant une exception pour la division par zéro avec un message d'erreur

41. * par défaut.</p>

42. */

43. public DivisionParZeroException()

44. {

45. super("Tentative de division par zéro !");

46. }

49. /**

50. * <p>>Constructeur spécifiant une exception pour la division par zéro avec le message d'erreur

51. * défini.</p>

52. * @param message Le message d'erreur de l'exception.

53. */

54. public DivisionParZeroException(String message)

55. {

56. super(message);

57. }

58. }

division/DivisionParZero.java

1. /*

2. * Fichier: DivisionParZero.java

3. * Crée le: 21 juin 2007.

4. * Modifié: 7 juillet 2007.

5. * Auteurs: Sébastien ESTIENNE.

6. * SiteWeb: http://www.prog-info.org/

7. *

8. * This program is free software; you can redistribute it and/or modify

9. * it under the terms of the GNU General Public License as published by

10. * the Free Software Foundation; either version 2 of the License, or

11. * (at your option) any later version.

12. *

13. * This program is distributed in the hope that it will be useful,

14. * but WITHOUT ANY WARRANTY; without even the implied warranty of

15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

16. * GNU General Public License for more details.

17. *

18. * You should have received a copy of the GNU General Public License

19. * along with this program; if not, write to the Free Software

20. * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

21. */

23. package chapitre10.division;

27. import java.awt.Container;

28. import java.awt.GridLayout;

29. import java.awt.event.ActionEvent;

30. import java.awt.event.ActionListener;

31. import java.text.DecimalFormat;

33. import javax.swing.JFrame;

34. import javax.swing.JLabel;

35. import javax.swing.JOptionPane;

36. import javax.swing.JTextField;

40. /**

41. * <p>Classe permettant de tester l'exception de division par zéro.</p>

42. * @author Sébastien ESTIENNE.

43. */

44. public class DivisionParZero extends JFrame implements ActionListener

45. {

46. /**

47. * <p>Serial version UID.</p>

48. */

49. private static final long serialVersionUID = 1L;

51. /** Etiquette pour le numérateur. */

52. private JLabel etiquetteNumerateur;

54. /** Etiquette pour le dénominateur. */

55. private JLabel etiquetteDenominateur;

57. /** Etiquette pour le résultat. */

58. private JLabel etiquetteResultat;

60. /** Champ texte pour le numérateur. */

61. private JTextField champNumerateur;

63. /** Champ texte pour le dénominateur. */

64. private JTextField champDenominateur;

66. /** Champ texte pour le résultat. */

67. private JTextField champResultat;

70. /**

71. * <p>Construction de l'application.</p>

72. */

73. public DivisionParZero()

74. {

75. // Appel du constructeur de la classe JFrame.

76. super("Division par zéro");

78. // Obtenir le panneau de contenu et changer son layout en un GridLayout.

79. Container conteneur = getContentPane();

80. conteneur.setLayout(new GridLayout(3, 2, 5, 5));

82. // Initialisation des composants de l'interface graphique.

83. this.etiquetteNumerateur = new JLabel("Numérateur :");

84. conteneur.add(this.etiquetteNumerateur);

85. this.champNumerateur = new JTextField();

86. conteneur.add(this.champNumerateur);

88. this.etiquetteDenominateur = new JLabel("Dénominateur :");

89. conteneur.add(this.etiquetteDenominateur);

90. this.champDenominateur = new JTextField();

91. conteneur.add(this.champDenominateur);

92. this.champDenominateur.addActionListener(this);

94. this.etiquetteResultat = new JLabel("Résultat :");

95. conteneur.add(this.etiquetteResultat);

96. this.champResultat = new JTextField();

97. this.champResultat.setEditable(false);

98. conteneur.add(this.champResultat);

100. // Modifie les propriétés de la fenêtre.

101. setSize(260, 110);

102. setLocation(100, 100);

103. setVisible(true);

104. }

107. /**

108. * <p>Traite une demande de calcul de quotient (résultat).</p>

109. * @param actionEvent Un événement sémantique qui indique qu'une action s'est produite dans le

110. *        composant concerné.

111. */

112. public void actionPerformed(ActionEvent actionEvent)

113. {

114. // Efface le champ résultat.

115. this.champResultat.setText("");

117. // Format du champ résultat.

118. DecimalFormat precision = new DecimalFormat("0.000");

120. // Essaie de récupérer les valeurs saisies et de calculer le quotient.

121. try

122. {

123. int numerateur = Integer.parseInt(this.champNumerateur.getText());

124. int denominateur = Integer.parseInt(this.champDenominateur.getText());

125. double resultat = quotient(numerateur, denominateur);

126. this.champResultat.setText(precision.format(resultat));

127. }

128. // Traite une erreur de format.

129. catch(NumberFormatException nfe)

130. {

131. JOptionPane.showMessageDialog(this,

132. "Le numérateur et le dénominateur doivent être des nombres entiers.",

133. "Erreur de format", JOptionPane.ERROR_MESSAGE);

134. }

135. // Traite une erreur de division par zéro.

136. catch(DivisionParZeroException dpze)

137. {

138. JOptionPane.showMessageDialog(this, dpze.getMessage(), "Erreur de division",

139. JOptionPane.ERROR_MESSAGE);

140. }

141. }

144. /**

145. * <p>Effectue la division.</p>

146. * @param pNumerateur Le numérateur.

147. * @param pDenominateur Le dénominateur.

148. * @return Le résultat de la division.

149. * @throws DivisionParZeroException Lance une exception lorsque le dénominateur vaut zéro.

150. */

151. public double quotient(int pNumerateur, int pDenominateur) throws DivisionParZeroException

152. {

153. if(pDenominateur == 0)

154. {

155. throw new DivisionParZeroException();

156. }

158. return (double) pNumerateur / pDenominateur;

159. }

162. /**

163. * <p>Lance l'application.</p>

164. * @param args Les paramètres de la ligne de commande.

165. */

166. public static void main(String[] args)

167. {

168. new DivisionParZero();

169. }

170. }

III - Fonctionnement des exceptions

III-1 - Énoncé

Écrivez une classe permettant d'illustrer le fonctionnement du bloc try / catch / finally.
Cette classe contient deux méthodes, une qui lance une exception et l'autre qui ne lance pas d'exception. Ces deux méthodes contiennent un bloc try / catch / finally ne faisant qu'afficher des messages de traces.

Classes de l'API utilisées :

- java.awt.BorderLayout

- java.awt.Container

- javax.swing.JFrame

- javax.swing.JScrollPane

- javax.swing.JTextArea

III-2 - Aperçu

Aperçu du résultat.

III-3 - Démonstration

Lancer avec Java Web Start

Note : javaws -viewer (accessible également depuis le panneau de configuration Java) permet de voir les différentes applications JWS en cache et de les gérer.

III-4 - Solution

FonctionnementExceptions.java

1. /*

2. * Fichier: FonctionnementException.java

3. * Crée le: 23 juin 2007.

4. * Modifié: 21 février 2009.

5. * Auteurs: Sébastien ESTIENNE.

6. * SiteWeb: http://www.prog-info.org/

7. *

8. * This program is free software; you can redistribute it and/or modify

9. * it under the terms of the GNU General Public License as published by

10. * the Free Software Foundation; either version 2 of the License, or

11. * (at your option) any later version.

12. *

13. * This program is distributed in the hope that it will be useful,

14. * but WITHOUT ANY WARRANTY; without even the implied warranty of

15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

16. * GNU General Public License for more details.

17. *

18. * You should have received a copy of the GNU General Public License

19. * along with this program; if not, write to the Free Software

20. * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

21. */

23. package chapitre10;

27. import java.awt.BorderLayout;

28. import java.awt.Container;

30. import javax.swing.JFrame;

31. import javax.swing.JScrollPane;

32. import javax.swing.JTextArea;

36. /**

37. * <p>Classe montrant le fonctionnement des exceptions.</p>

38. * @author Sébastien ESTIENNE.

39. */

40. public class FonctionnementExceptions extends JFrame

41. {

42. /**

43. * <p>Serial version UID.</p>

44. */

45. private static final long serialVersionUID = 1L;

47. /** Zone de sortie. */

48. private JTextArea zoneSortie = null;

51. /**

52. * <p>Construction de l'application.</p>

53. */

54. public FonctionnementExceptions()

55. {

56. // Appel du constructeur de la classe JFrame.

57. super("Fonctionnement Exceptions");

59. // Obtenir le panneau de contenu et changer son layout en un BorderLayout.

60. Container conteneur = getContentPane();

61. conteneur.setLayout(new BorderLayout());

63. // Initialisation des composants de l'interface graphique.

64. this.zoneSortie = new JTextArea();

65. conteneur.add(new JScrollPane(this.zoneSortie));

67. // Test de la méthode lancerException.

68. try

69. {

70. lancerException();

71. }

72. catch(Exception e)

73. {

74. this.zoneSortie.append("main : Exception capturée dans le bloc catch.\n");

75. }

77. // Test de la méthode nePasLancerException.

78. this.zoneSortie.append("\n");

79. nePasLancerException();

81. // Modifie les propriétés de la fenêtre.

82. setSize(400, 200);

83. setLocation(100, 100);

84. setVisible(true);

85. }

88. /**

89. * <p>Méthode permettant d'illustrer le concept try/catch/finally et simulant le lancement d'une

90. * exception.</p>

91. * @throws Exception L'exception lancée.

92. */

93. public void lancerException() throws Exception

94. {

95. // Début de la méthode.

96. this.zoneSortie.append("lancerException : Début de la méthode.\n");

98. // Lance une exception.

99. try

100. {

101. this.zoneSortie.append("lancerException : Passage dans le bloc try.\n");

102. throw new Exception();

103. }

104. // Capture l'exception et la relance.

105. catch(Exception e)

106. {

107. this.zoneSortie.append("lancerException : Exception capturée dans le bloc catch.\n");

108. throw e;

109. }

110. // Code exécuté qu'une exception soit lancée ou non.

111. finally

112. {

113. this.zoneSortie.append("lancerException : Passage dans le bloc finally.\n");

114. }

116. // Code inaccessible.

117. // this.zoneSortie.append("lancerException : Fin de la méthode.\n");

118. }

121. /**

122. * <p>Méthode permettant d'illustrer le concept try/catch/finally et qui ne lève pas

123. * d'exception.</p>

124. */

125. public void nePasLancerException()

126. {

127. // Début de la méthode.

128. this.zoneSortie.append("nePasLancerException : Début de la méthode.\n");

130. // Entrée dans le bloc try.

131. try

132. {

133. this.zoneSortie.append("nePasLancerException : Entrée dans le bloc try.\n");

134. }

135. // Ce bloc ne s'exécute pas, car aucune exception n'est levée.

136. catch(Exception e)

137. {

138. this.zoneSortie.append("nePasLancerException : Mince on est dans le bloc catch!\n");

139. this.zoneSortie.append(e.toString());

140. }

141. // Code exécuté qu'une exception soit lancée ou non.

142. finally

143. {

144. this.zoneSortie.append("nePasLancerException : Passage dans le bloc finally.\n");

145. }

147. // Fin de la méthode.

148. this.zoneSortie.append("nePasLancerException : Fin de la méthode.\n");

149. }

152. /**

153. * <p>Lance l'application.</p>

154. * @param args Les paramètres de la ligne de commande.

155. */

156. public static void main(String[] args)

157. {

158. new FonctionnementExceptions();

159. }

160. }

IV - Saisie de longueurs

IV-1 - Énoncé

Écrivez un programme contenant une classe d'exception de longueur négative héritant de la classe ArithmeticException ainsi qu'une classe permettant de tester cette exception.
Cette classe de test est une application graphique qui contient une zone de texte pour afficher les messages. Elle contient une méthode permettant la saisie d'une valeur de longueur. La saisie est redemandée jusqu'à ce que celle-ci soit valide. Une boîte de dialogue d'erreur et une trace (printStackTrace) sont affichées lorsque la valeur saisie n'est ni un entier ni une valeur positive.
Utilisez cette fonction pour demander la saisie de la longueur et de la largeur d'un rectangle pour afficher ensuite les informations saisies et l'aire du rectangle.

Classes de l'API utilisées :

- java.awt.BorderLayout

- java.awt.Container

- javax.swing.JFrame

- javax.swing.JOptionPane

- javax.swing.JScrollPane

- javax.swing.JTextArea

IV-2 - Aperçu

Aperçu du résultat.

Aperçu du résultat.

IV-3 - Démonstration

Lancer avec Java Web Start

Note : javaws -viewer (accessible également depuis le panneau de configuration Java) permet de voir les différentes applications JWS en cache et de les gérer.

IV-4 - Solution

rectangle/LongueurNegativeException.java

1. /*

2. * Fichier: LongueurNegativeException.java

3. * Crée le: 23 juin 2007.

4. * Modifié: 7 juillet 2007.

5. * Auteurs: Sébastien ESTIENNE.

6. * SiteWeb: http://www.prog-info.org/

7. *

8. * This program is free software; you can redistribute it and/or modify

9. * it under the terms of the GNU General Public License as published by

10. * the Free Software Foundation; either version 2 of the License, or

11. * (at your option) any later version.

12. *

13. * This program is distributed in the hope that it will be useful,

14. * but WITHOUT ANY WARRANTY; without even the implied warranty of

15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

16. * GNU General Public License for more details.

17. *

18. * You should have received a copy of the GNU General Public License

19. * along with this program; if not, write to the Free Software

20. * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

21. */

23. package chapitre10.rectangle;

27. /**

28. * <p>Classe d'exception pour une valeur de longueur négative.</p>

29. * @author Sébastien ESTIENNE.

30. */

31. public class LongueurNegativeException extends ArithmeticException

32. {

33. /**

34. * <p>Serial version UID.</p>

35. */

36. private static final long serialVersionUID = 1L;

39. /**

40. * <p>Constructeur spécifiant une exception pour une longueur négative avec un message d'erreur

41. * par défaut.</p>

42. */

43. public LongueurNegativeException()

44. {

45. super("Une valeur de longueur ne peut être négative!");

46. }

49. /**

50. * <p>>Constructeur spécifiant une exception pour une longueur négative avec le message d'erreur

51. * défini.</p>

52. * @param message Le message d'erreur de l'exception.

53. */

54. public LongueurNegativeException(String message)

55. {

56. super(message);

57. }

58. }

rectangle/SaisieRectangle.java

1. /*

2. * Fichier: SaisieRectangle.java

3. * Crée le: 23 juin 2007.

4. * Modifié: 21 février 2009.

5. * Auteurs: Sébastien ESTIENNE.

6. * SiteWeb: http://www.prog-info.org/

7. *

8. * This program is free software; you can redistribute it and/or modify

9. * it under the terms of the GNU General Public License as published by

10. * the Free Software Foundation; either version 2 of the License, or

11. * (at your option) any later version.

12. *

13. * This program is distributed in the hope that it will be useful,

14. * but WITHOUT ANY WARRANTY; without even the implied warranty of

15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

16. * GNU General Public License for more details.

17. *

18. * You should have received a copy of the GNU General Public License

19. * along with this program; if not, write to the Free Software

20. * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

21. */

23. package chapitre10.rectangle;

27. import java.awt.BorderLayout;

28. import java.awt.Container;

30. import javax.swing.JFrame;

31. import javax.swing.JOptionPane;

32. import javax.swing.JScrollPane;

33. import javax.swing.JTextArea;

37. /**

38. * <p>Classe permettant de saisir les informations d'un rectangle.</p>

39. * @author Sébastien ESTIENNE.

40. */

41. public class SaisieRectangle extends JFrame

42. {

43. /**

44. * <p>Serial version UID.</p>

45. */

46. private static final long serialVersionUID = 1L;

48. /** Zone de sortie. */

49. private JTextArea zoneSortie;

52. /**

53. * <p>Construction de l'application.</p>

54. */

55. public SaisieRectangle()

56. {

57. // Appel du constructeur de la classe JFrame.

58. super("Saisie rectangle");

60. // Obtenir le panneau de contenu et changer son layout en un GridLayout.

61. Container conteneur = getContentPane();

62. conteneur.setLayout(new BorderLayout());

64. // Initialisation des composants de l'interface graphique.

65. this.zoneSortie = new JTextArea();

66. this.zoneSortie.setEditable(false);

67. conteneur.add(new JScrollPane(this.zoneSortie));

69. // Modifie les propriétés de la fenêtre.

70. setSize(400, 200);

71. setLocation(100, 100);

72. setVisible(true);

74. // Demande les informations du rectangle.

75. int longueur = demanderDimension("Saisissez la longueur du rectangle :");

76. int largeur = demanderDimension("Saisissez la largeur du rectangle :");

77. this.zoneSortie.append("Longueur du rectangle : " + longueur + "\n");

78. this.zoneSortie.append("Largeur du rectangle : " + largeur + "\n");

79. this.zoneSortie.append("Aire du rectangle : " + (longueur * largeur));

80. }

83. /**

84. * <p>Demande une valeur de dimension à l'utilisateur.</p>

85. * @param message Le message de demande.

86. * @return Retourne la valeur de la dimension saisie.

87. */

88. public int demanderDimension(String message)

89. {

90. // Indique si la valeur saisie est valide ou non.

91. boolean estValide = false;

93. // La valeur de la longueur;

94. int longueur = 0;

96. // Demande une valeur de longueur à l'utilisateur tant que la saisie est invalide.

97. String sDimension = null;

98. while(!estValide)

99. {

100. // Demande la saisie d'une longueur et essaie de le convertir.

101. sDimension = JOptionPane.showInputDialog(null, message, "Saisie longueur",

102. JOptionPane.QUESTION_MESSAGE);

104. // Essaie de convertir la valeur saisie.

105. try

106. {

107. longueur = Integer.parseInt(sDimension);

108. if(longueur < 0)

109. {

110. throw new LongueurNegativeException();

111. }

112. estValide = true;

113. }

114. // Affiche un message d'erreur si la saisie n'est pas un entier.

115. catch(NumberFormatException e)

116. {

117. JOptionPane.showMessageDialog(null, "La valeur saisie n'est pas un entier.", "Erreur",

118. JOptionPane.ERROR_MESSAGE);

119. this.zoneSortie.append(e.getMessage() + "\n");

120. StackTraceElement[] elements = e.getStackTrace();

121. for(StackTraceElement elem : elements)

122. {

123. this.zoneSortie.append(elem.toString() + "\n");

124. }

125. this.zoneSortie.append("\n");

126. }

127. // Affiche un message d'erreur si l'entier n'est pas positif.

128. catch(LongueurNegativeException e)

129. {

130. JOptionPane.showMessageDialog(null, "Une valeur de longueur ne peut être négative.",

131. "Erreur", JOptionPane.ERROR_MESSAGE);

132. this.zoneSortie.append(e.getMessage() + "\n");

133. StackTraceElement[] elements = e.getStackTrace();

134. for(StackTraceElement elem : elements)

135. {

136. this.zoneSortie.append(elem.toString() + "\n");

137. }

138. this.zoneSortie.append("\n");

139. }

140. }

142. return longueur;

143. }

146. /**

147. * <p>Lance l'application.</p>

148. * @param args Les paramètres de la ligne de commande.

149. */

150. public static void main(String[] args)

151. {

152. new SaisieRectangle();

153. }

154. }

V - Remerciements

Je tiens à remercier christopheJ, Baptiste Wicht, eusebe19 et jacques_jean pour les conseils, remarques et relectures.
Je remercie aussi www.developpez.com me permettant de publier cet article et Nono40 pour ses outils.