2017-10-17 1 views
0

Ecrivez un programme qui calcule la moyenne de N entiers. Le programme devrait inviter l'utilisateur à entrer la valeur de N et ensuite entrer tous les Nnumbers. Si l'utilisateur entre une valeur non positive pour N alors une exception devrait être levée (et interceptée) avec le message "N doit être positif". S'il y a une exception lorsque l'utilisateur entre les N numéros, un message d'erreur doit s'afficher et l'utilisateur est invité à entrer de nouveau le numéro. Si l'utilisateur n'entre pas un nombre entier, le programme doit demander l'utilisation pour entrer à nouveau la valeur. Est-ce que je lance l'exception correctement?Moyenne de calcul de programme Java avec des exceptions

import java.util.Scanner; 
import java.util.InputMismatchException; 

class Playground { 
    public static void main(String[ ] args) { 
     int sum = 0, mean; 
     System.out.println("Please enter number of integers"); 
     Scanner sc1 = new Scanner(System.in); 
     int counter = sc1.nextInt(); 

     if (counter <= 0) { 
      throw new InputMismatchException("N must be positive"); 
     } 
     else { 
      System.out.println("Please enter "+counter+" numbers"); 
     } 

     for (int i =0; i< counter; i++) { 
      int inputnum = sc1.nextInt(); 
      if (inputsum <= 0){ 
       throw new InputMismatchException("Please enter again"); 
       continue; 
      } 
      sum = sum+inputnum; 
      System.out.println(); 
     } 


     mean = sum/counter; 

     System.out.println(mean); 

    } 
} 
+2

Non, vous ne le faites pas correctement. De votre question: "* devrait être jeté (** et attrapé **) *" - Vous n'attrapez pas l'exception. Le 'continue' que vous avez après' throw' est en fait un code inaccessible. – Maroun

+1

Remplacez 'throw new InputMismatchException (" Veuillez entrer à nouveau ");' avec 'System.err.println (" Please enter again ");', et everthing fonctionnera comme prévu. Lire un tutoriel sur les exceptions. – clemens

+1

Bien que vous souhaitiez demander à votre utilisateur d'entrer à nouveau l'entrée, votre boucle for continue de cocher. En outre, même si le nombre est non positif, vous l'ajoutez toujours à votre somme alors que vous êtes censé le rejeter. Ce sont quelques problèmes supplémentaires en dehors de la gestion des exceptions qui a été mentionné par d'autres. – Nishit

Répondre

2

exceptions sont Jeté pris par l'instruction try/catch qui correspond à la plus interne entourant la classe d'exception. Dans ce cas, l'instruction try/catch est en dehors de votre méthode principale. En d'autres termes, lorsqu'une exception est levée, elle est interceptée en dehors de la fonction principale, et votre programme se termine. Les exceptions sont particulièrement utiles lorsque nous avons une erreur dans une fonction appelée et que nous devons la signaler à l'appelant en ignorant la valeur de retour, qui n'a donc pas besoin de réserver une valeur pour les erreurs.

Dans cette ligne.

throw new InputMismatchException("Please enter again"); 
continue; 

continue rien ne sera jamais atteint par le contrôle depuis throw (comme un return) rend le contrôle laisser la méthode.

Si vous remplacez ce throw par un simple System.out.println décrivant le problème, votre programme fonctionnera comme vous le souhaitez.

Modifier: puisque vous avez besoin d'un exemple concret, considérez votre déclaration for. Vous utilisez Scanner#nextInt() pour obtenir le numéro suivant. Il peut jeter un IllegalStateException si le Scanner a terminé sa source d'entrée? Puis:

try { 
    for (int i =0; i< counter; i++) { 
       /* … */ 
    } 
} catch (IllegalStateException ex) { 
    System.err.println(ex.getMessage()); 
} 

Si IllegalStateException se produit, ce qui rend le saut de contrôle dans la clause catch, ce qui en fait sortir de la déclaration for sans effort.

+0

merci pour la réponse. Cela prend tout son sens maintenant, mais dans la question elle-même, il y a des lancers prévus.Lance: InputMismatchException - si le jeton suivant ne correspond pas à l'expression régulière Integer ou est hors de portée NoSuchElementException - si l'entrée est épuisée IllegalStateException - si ce scanneur est fermé. Je me demande donc si je pourrais améliorer mon programme ou le rendre plus valable en l'utilisant le mieux possible? –

+1

Utiliser 'throw 'dans votre code n'a aucun sens si votre programme ne fournit pas une" interface "à quelque chose mais c'est juste un simple programme qui prend ses entrées et donne sa sortie. En passant, si vous voulez vraiment les utiliser, vous pouvez utiliser les instructions try/catch. Je vais vous faire un exemple dans la question. – NoImaginationGuy

0

Est-ce mieux ou y at-il quelque chose qui ne va pas?

import java.util.Scanner; 
import java.util.InputMismatchException; 
import java.util.NoSuchElementException; 
import java.util.IllegalStateException; 

public class Calculator{ 
    public static void main(String[] args){ 
     int sum =0, mean; 
     System.out.println("Please enter no."); 
     Scanner sc1= new Scanner(System.in); 
     int counter = sc1.nextInt(); 
     if (counter <=0){ 
      throw new InputMismatchException("not valid no."); 
     } 
     else { 
      try { 
       for (int i = 0;i<counter;i++){ 
        int inputsum= sc1.nextInt(); 
        sum = inputsum+sum; 
        System.out.println(); 
       } 
       mean = sum/counter; 
       System.out.println(mean); 
      } 
      catch(IllegalStateException | NoSuchElementException | InputMismatchException e){ 
       System.err.println(e.getMessage); 
      } 
     } 
     catch(InputMismatchException e) { 
      System.out.println(e.getMessage); 
     } 
    } 
}