2017-09-12 1 views
0

Je souhaite créer un programme qui gère les 3 exceptions possibles qui se produisent lors de la division de deux nombres, en demandant à l'utilisateur de corriger l'entrée s'il déclenche une exception. Le code s'exécute uniquement si aucune exception n'est déclenchée. Le code suivant fonctionne, mais je pense que c'est trop peu optimisé. N'y a-t-il pas d'autre moyen, en dehors des boucles en boucle, de vérifier en permanence les exceptions?Optimisation du traitement des exceptions dans Java

import javax.swing.JOptionPane; 

public class DivisionExceptions { 

public int divide(int num, int den) { 
    return num/den; 
} 

public static void main(String[] args) { 
    int num = 0, 
     den = 0, 
     a = 0, 
     b = 0, 
     c = 0; 

    DivisionExceptions div = new DivisionExceptions(); 

     while(a == 0) { 
      try { 
       num = Integer.parseInt(JOptionPane.showInputDialog("Introduce the first int")); 
       a++; 
      } 
      catch (NumberFormatException e) { 
       JOptionPane.showMessageDialog(null, "Error of type: " + e.getMessage() + ". Verify the information and try again."); 
      } 
     } 
    while (c == 0) {  
     b = 0; 
     while(b == 0) { 
      try { 
       den = Integer.parseInt(JOptionPane.showInputDialog("Introduce the second int")); 
       b++; 
      } 
      catch (NumberFormatException e) { 
       JOptionPane.showMessageDialog(null, "Error of type: " + e.getMessage() + ". Verify the information and try again."); 
      } 
     } 

     try { 
      JOptionPane.showMessageDialog(null, "Result of dividing: " + num + "/" + den + " is " + div.divide(num, den)); 
      c++; 
     } 
     catch (ArithmeticException e) { 
      JOptionPane.showMessageDialog(null, "Error of type: " + e.getMessage() + ". Verify the information and try again."); 
     } 
    } 
} 

}

+0

Tout va bien, toute optimisation que vous faites sera complètement imperceptible. Vous pourriez vouloir nettoyer votre espacement de tabulation cependant. –

+0

Quand il y a une exception ArithmeticException, ils peuvent seulement revenir en arrière pour essayer une autre valeur pour 'den', mais pas' num'. Est-ce l'intention? – jingx

+0

@jingx oui, c'est l'intention, puisqu'il n'y a aucune raison de modifier le numérateur si le dénominateur est 0. – Razonixx

Répondre

0

pourrait être simplifié à:

public static void main(String[] args) { 
    int num = 0, den = 0; 

    DivisionExceptions div = new DivisionExceptions(); 

    while(true) { 
     try { 
      num = Integer.parseInt(JOptionPane.showInputDialog("Introduce the first int")); 
      break; 
     } catch (NumberFormatException e) { 
      JOptionPane.showMessageDialog(null, "Error of type: " + e.getMessage() + ". Verify the information and try again."); 
     } 
    } 

    while (true) { 
     try { 
      den = Integer.parseInt(JOptionPane.showInputDialog("Introduce the second int")); 
      JOptionPane.showMessageDialog(null, "Result of dividing: " + num + "/" + den + " is " + div.divide(num, den)); 
      break; 
     } catch (NumberFormatException | ArithmeticException e) { 
      JOptionPane.showMessageDialog(null, "Error of type: " + e.getMessage() + ". Verify the information and try again."); 
     } 
    } 
} 

~

+0

C'est ce que je cherchais, merci! – Razonixx

0

Eh bien votre code pourrait utiliser un refactoring.

public class DivisionExceptions { 

public int divide(int num, int den) { 
    return num/den; 
} 

public static void main(String[] args) { 
    int num = 0, 
      den = 0, 
      a = 0, 
      b = 0, 
      c = 0; 

    DivisionExceptions div = new DivisionExceptions(); 
    num = getNum(a, "Introduce the first int"); 
    den = getNum(b, "Introduce the second int"); 
    while (c == 0) { 
     try { 
      JOptionPane.showMessageDialog(null, "Result of dividing: " + num + "/" + den + " is " + div.divide(num, den)); 
      c++; 
     } catch (ArithmeticException e) { 
      JOptionPane.showMessageDialog(null, "Error of type: " + e.getMessage() + ". Verify the information and try again."); 
     } 
    } 
} 

private static int getNum(int loopParam, String message) { 
    int num = 0; 
    while (loopParam == 0) { 
     try { 
      num = Integer.parseInt(JOptionPane.showInputDialog(message)); 
      loopParam++; 
     } catch (NumberFormatException e) { 
      JOptionPane.showMessageDialog(null, "Error of type: " + e.getMessage() + ". Verify the information and try again."); 
     } 
    } 
    return num; 
} 
} 

Je me permets également d'extraire le calcul de den de while (c == 0) boucle, car il calcule toujours même valeur mais pour n fois, vous gagnez un peu optimilization ici. Si vous pouvez fournir plus d'informations sur la raison pour laquelle vous prédéfinissez tous vos params comme 0, peut-être que je pourrais trouver une solution pour cela alors que (c == 0) boucle. Si vous utilisez java 8, vous pouvez aussi extraire votre boucle while vers une autre méthode et lui donner une fonction en tant que param.