Java 8 - Exemples mathématiques exacts
Java 8 a introduit de nouvelles méthodes dans la classeMath
qui lèveront unArithmeticException
pour gérer les débordements. Ces méthodes se composent deaddExact
,substractExact
,multiplyExact
,incrementExact
,decrementExact
etnegateExact
avecint
etlong
arguments. En outre, il existe une méthode statiquetoIntExact
pour convertir une valeurlong
enint
qui renvoie égalementArithmeticException
.
Avant Java 8, le programmeur devait déboguer manuellement pour trouver les variables du code qui débordaient. J'étais très heureux de découvrir que Java 8 a introduit un nouvel ensemble de méthodes qui lèvent une exception lorsque le résultat déborde. Pour de nombreux développeurs, ce changement n'a pas d'effet majeur, mais pour les modestes développeurs comme moi, cela affectera certainement le temps passé à se gratter la tête pour comprendre pourquoi le résultat est faux ou à prendre des précautions compliquées pour éviter un débordement.
1. Math.multiplyExact
Cet exemple montre la différence entre la multiplication commune et le nouveaumultiplyExact
MultiplyExact.java
package com.techfou.exactmethods; package com.techfou; public class MultiplyExact { public static void main(String[] args) { int x = Integer.MAX_VALUE; //( = 2 147 483 647) int y = Integer.MAX_VALUE; Object z; System.out.println("---Before Java 8---"); z = x * y; System.out.println("z : " + z); System.out.println("\n---Since Java 8---"); try { z = Math.multiplyExact(x, y); } catch (ArithmeticException e) { System.out.println(e.getMessage()); //Java 8 throws integer overflow z = Math.multiplyExact((long) x, (long) y); System.out.println("z : " + z); } if (z instanceof Long) { System.out.println("\n> yuuuup z is Long"); } } }
Sortie:
---Before Java 8--- z : 1 ---Since Java 8--- integer overflow z : 4611686014132420609 > yuuuup z is Long
2. Détecter et gérer le débordement
Un exemple où nous gérons le débordement pourinteger
et déterminons le débordement pourlong
.
MultiplyExact2.java
package com.example.exactmethods; public class MultiplyExact2 { public static void main(String[] args) { int x = 1000000; int y = 1000000; long a = Long.MAX_VALUE; //( = 9 223 372 036 854 775 807) long b = Long.MAX_VALUE; Object z, c; System.out.println("---Before Java 8---"); z = x * y; c = a * b; System.out.println("z : " + z); System.out.println("c : " + c); System.out.println("\n---Since Java 8---"); try { z = Math.multiplyExact(x, y); c = Math.multiplyExact(a, b); } catch (ArithmeticException e) { try { z = Math.multiplyExact((long) x, (long) y); c = null; } catch (ArithmeticException ex) { z = null; } } if (z instanceof Integer) { System.out.println("z is instance of Integer: " + z); } if (z instanceof Long) { System.out.println("z is instance of Long: " + z); } else { System.out.println("Overflow for z"); } if (c instanceof Integer) { System.out.println("Instance of Integer: " + c); } if (c instanceof Long) { System.out.println("Instance of Long: " + c); } else { System.out.println("Overflow for c"); } } }
Sortie:
---Before Java 8--- z : -727379968 c : 1 ---Since Java 8--- z is instance of Long: 1000000000000 Overflow for c
3. Toutes les méthodes xxxExact
Un exemple démontrant toutes les nouvelles méthodesxxxExact
AllExactMethods.java
package com.example.exactmethods; public class AllExactMethods { public static void main(String[] args){ int x = 10000; int y = 10000; Object z; z = Math.addExact(x, y); System.out.println("addExact: " + x + " + " + y + " = " + z); z = Math.subtractExact(x, y); System.out.println("subtractExact: " + x + " - " + y + " = " + z); z = Math.multiplyExact(x, y); System.out.println("multiplyExact: " + x + " * " + y + " = " + z); z = Math.incrementExact(x); System.out.println("incrementExact: " + x + " + 1 = " + z); z = Math.decrementExact(y); System.out.println("decrementExact: " + y + " - 1 = " + z); z = Math.negateExact(x); System.out.println("negateExact: " + x + " * -1 = " + z); } }
Sortie:
addExact: 10000 + 10000 = 20000 subtractExact: 10000 - 10000 = 0 multiplyExact: 10000 * 10000 = 100000000 incrementExact: 10000 + 1 = 10001 decrementExact: 10000 - 1 = 9999 negateExact: 10000 * -1 = -10000