Java Exception

Résolu/Fermé
keurdange
Messages postés
718
Date d'inscription
lundi 8 novembre 2010
Statut
Membre
Dernière intervention
13 juillet 2016
- 24 nov. 2011 à 21:13
keurdange
Messages postés
718
Date d'inscription
lundi 8 novembre 2010
Statut
Membre
Dernière intervention
13 juillet 2016
- 24 nov. 2011 à 23:44
Bonjour,

J'aimerais faire un programme qui gère les exceptions (dans mon cas ci dessous une division par zéro. Si c'est le cas, il fait appel à une méthode pour refaire la division) mais il y a toujours une erreurs comme indiqué ci dessous:

import java.util.Scanner;
public class Division {
public static void MaDivision(float a,float b) throws DivisionZero
{
float prod = a/b; throw new DivisionZero();
//l'erreur se trouve ici. je pense que c'est le fait que DivisionZero n'est pas ici dans la classe Division Zero mais comment déclarer l'exception alors??
}
public static void main(String args[]) throws DivisionZero
{
float x,y;
Division div=new Division();
Scanner ngal=new Scanner(System.in);
System.out.println("Entrez les valeurs");
x=ngal.nextFloat();
y=ngal.nextFloat();
div.MaDivision(x, y);
}

class DivisionZero extends Exception{
public DivisionZero() throws DivisionZero
{
Division div=new Division();
Scanner Ngal=new Scanner(System.in);
System.out.println("Attention, division par zéro impossible\nVeuillez rentrer les nombres");
float a=Ngal.nextFloat();
float b=Ngal.nextFloat();
div.MaDivision(a, b);
}

}


}

N.B: je sais le faire avec try() catch(ArithmeticException e) mais je veux encore plus gérer l'exception et créer par moi même mon exception.

Merci.


1 réponse

KX
Messages postés
16584
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 août 2022
2 972
Modifié par KX le 24/11/2011 à 21:37
Le problème vient que tu as déclaré ta classe DivisionZero à l'intérieur de la classe Division.
Pour corriger le problème tu dois "au choix" déclarer la classe à part, ou la déclarer à l'intérieur mais static. Dans les deux cas une encapsulation public ne ferait pas de mal ;-)
La confiance n'exclut pas le contrôle
0
KX
Messages postés
16584
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 août 2022
2 972
Modifié par KX le 24/11/2011 à 22:01
Cependant : une exception n'est rien censé faire à part indiquer qu'elle existe.
Faire un traitement dans le constructeur de l'exception est pour le moins... moche !

En plus tu fais un throws DivisionZero sur le constructeur de l'exception DivisionZero, c'est un peu spécial quand même... D'autant que le traitement est spécifique à une seule des tes méthodes alors qu'elle devrait au moins pouvoir être utilisée sur toutes les méthodes de ta classe et de ses classes filles (notions de réutilisabilité en conception objet)

Remarque (je n'en finis plus ^^) : quitte à hériter d'une exception, autant hériter de ArithmeticException, sans oublier de faire un appel à super.

Evidemment l'intérêt est très limité ici, mais même pour l'exemple autant faire du code qui ressemble à peu près à ce que tu pourrais avoir à faire un jour en vrai ;-)

public class Division
{
	// ...

	public static class DivisionZero extends ArithmeticException
	{
		private static final long serialVersionUID = 1L;
	
		public DivisionZero()
		{
			super("Division par zéro impossible");
		}
	}
}
0
keurdange
Messages postés
718
Date d'inscription
lundi 8 novembre 2010
Statut
Membre
Dernière intervention
13 juillet 2016
219
24 nov. 2011 à 22:41
Merci, ca marche
0
KX
Messages postés
16584
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 août 2022
2 972
24 nov. 2011 à 22:48
Remarque ; avec les ArithmeticException, et les RuntimeException en général, tu n'es pas obligé de faire des try catch ou des throws partout (de la même manière que tu ne mets pas de try à chaque fois que tu fais a/b ^^)
0
keurdange
Messages postés
718
Date d'inscription
lundi 8 novembre 2010
Statut
Membre
Dernière intervention
13 juillet 2016
219
24 nov. 2011 à 23:10
j'ai déplacé l'exception pour corriger le problème mais j'ai pas compris ton private static final long serialVersionUID = 1L; surtout l'initialisation à 1L.

Merci
0
KX
Messages postés
16584
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 août 2022
2 972
24 nov. 2011 à 23:19
Les exceptions implémentent l'interface Serializable qui demande un numéro de version.
Par défaut Eclipse me le met directement à 1 (le L pour dire que c'est de type long)
0