try-catch pour la division par zéro
Ma question est sur les blocs try-catch sur une simple division par zéro par exemple. Vous voyez la première ligne de l'essayer? Si je jette un de ces deux variables à la double le programme ne reconnaît pas le bloc catch. À mon avis, si je lance ou pas seulement le bloc catch doit être exécutée. Quel est le problème sur ce code?
public static void main(String[] args) {
int pay=8,payda=0;
try {
double result=pay/(double)payda; //if I cast any of the two variables, program does not recognize the catch block, why is it so?
System.out.println(result);
System.out.println("inside-try");
} catch (Exception e) {
System.out.println("division by zero exception");
System.out.println("inside-catch");
}
}
OriginalL'auteur Firat | 2010-02-13
Vous devez vous connecter pour publier un commentaire.
Division par zéro est valable pour les nombres en virgule flottante.
Ces "numéros" sont correctement définies dans la norme IEEE 754.
Division entière par zéro, d'autre part, les lancers, car on ne peut pas représenter l'infini en un
int
.Je ne pense pas que
int
jette car il ne peut pas représenter l'infini. 1/0 est tout simplement dénuée de sens, et c'est pourquoi il jette. Virgule flottante, d'autre part, fait un peu la main en agitant et dit: "il devrait être de l'infini".OriginalL'auteur kennytm
Je vous suggère de vérifier:
plutôt que de rattraper une exception
l'hypothèse est qu'ils sont des nombres entiers, comme dans l'exemple ci-dessus
OriginalL'auteur Bozho
Puisque vous êtes un auto-proclamé "débutant", je pense que ce serait une bonne idée de montrer certaines des questions plus larges avec votre code. (Je sais, c'est pas le code de production, mais tout permet de supposer pour les besoins de la discussion qu'il a été.)
Si une exception est attendue, il est généralement plus simple, plus clair et plus efficace si vous constatez l'état, qui donnera lieu à l'exception. Dans ce cas, si vous vous attendez à
divisor
, à l'occasion, être de zéro, il est préférable de le tester avant de faire la division.Sur l'autre main, si une exception est totalement inattendu (c'est à dire un "bug"), la meilleure stratégie est de laisser l'exception de la propager à l'extérieur. À ce moment de votre demande de prise doit intercepter toutes les exceptions, journal de l'exception stacktrace et renflouer.
En dehors de la puce précédente, c'est une mauvaise idée d'attraper
Exception
,RuntimeException
,Throwable
ouError
. Cela permettra d'attraper un grand nombre d'exceptions que vous n'avez probablement pas l'intention de l'attraper. Dans ce cas, puisque vous attendez unArithmeticException
, vous devez attraper juste que.Il est rarement correct d'utiliser
float
oudouble
dans les applications financières. Ces types ne sont pas exactes, mais les applications financières nécessitent généralement des quantités d'argent pour être traitées exactement.Plus généralement, les nombres à virgule flottante sont par nature difficile pour les laïcs (et débutants) à comprendre. Beaucoup de "vérités" que les gens s'attendent à tenir réellement à ne pas retenir. Par exemple, un flottant de calcul de
1.0/3.0 + 1.0/3.0 + 1.0/3.0
ne donne pas1.0
. De la même façon (comme vous l'avez découvert) division par zéro se comporte différemment. Si vous souhaitez utiliser la virgule flottante en toute sécurité, vous devez comprendre les pièges.MODIFIER de l'élaboration du premier point en réponse à @Jay commentaire.
Tout d'abord, j'ai délibérément utilisé le mot "habituellement". Il y a des cas où, en évitant de jeter l'attend exception ne réalise rien.
Après avoir dit que, souvent, vous ne voulez pas d'un générique "attendu" d'exception pour arriver même si votre application ne peut pas faire face à la situation immédiatement. Par exemple, si l'OP du code faisait partie de quelque chose de plus grand, il peut être préférable explicitement jeter
IllegalArgumentException
(si c'est une violation d'une API de contrat) ou de certains vérifiéUserEnteredRubbishException
si nous savons que c'est le résultat d'une mauvaise saisie de l'utilisateur (et il existe une possibilité de report /corriger).Le fait que nous sommes "s'attend" une exception signifie par définition que nous en savons plus sur ce que (dire) un générique
ArithmeticException
dirais. Si nous permettons à un générique d'exception pour se propager, il est plus difficile pour un bloc catch pile nombreux cadres d'agir de manière appropriée. Dans ce cas, par exemple, la télécommande bloc catch ne pouvait pas diagnostiquer la cause de la division par zéro avec certitude. LeArithmeticException
pourrait provenant d'une autre partie de l'application, et peut pas - être même une division par zéro! La réponse est explicitement jetant un plus spécifiques exception.Mais mega dittos sur les #3 et #4. Attraper un générique exception est rarement productif. Vous n'avez aucune idée de ce que vous êtes chasse. Par la manière, je pourrais ajouter: Corollaire: Ne jetez pas des exceptions génériques. Si votre programme détecte une condition d'erreur et que vous souhaitez lancer une exception, prenez dix minutes pour créer une nouvelle classe qui s'étend exception. Ne vous contentez pas de " throw new Exception("Foo manquait un bar")' ou quoi que ce soit.
OriginalL'auteur Stephen C
La réponse se trouve dans votre programme de sortie - elle imprime "l'Infini" pour
result
. C'est parce que Java n'autorise pas de division entière par zéro virgule flottante de la division par zéro est légal et produitInfinity
.Consultez la documentation de Double et Flotteur pour la
POSITIVE_INFINITY
etNEGATIVE_INFINITY
constantes.OriginalL'auteur danben
Seule division par zéro avec des entiers déclenche une ArithmeticException.
La Division par zéro avec un lit double ou float entraînera l'Infini.
OriginalL'auteur Desintegr
Parce que la division de deux doubles renvoie une Infinité, mais ne les jetez pas. Vous pouvez utiliser isInfinite() pour vérifier cela. Toutefois, la solution la plus appropriée (comme déjà mentionné) est de vérifier le dénominateur avant la division.
OriginalL'auteur Matthew Flaschen
Personne ne devrait essayer de s'attendre à ce
RuntimeException
à être levée à partir de leur code. CesException
s peut être (et devraient) être facilement évité.OriginalL'auteur fastcodejava