-1
votes

Pourquoi mon attraction attrape-t-il lorsqu'il est utilisé pour attraper une erreur imprimer l'erreur et mon bloc de prise?

J'apprends actuellement des blocs de code Try-Catch et j'écris un morceau de code qui prend une entrée d'un utilisateur et des chèques si son entier ou non. Mon code est

Hello! Please enter how many Students you have in your class: 
asdfsda

Invalid input. please make sure you enter numbers ONLY! No symbols or 
letters.

Exception in thread "main" java.util.InputMismatchException
at java.base/java.util.Scanner.throwFor(Scanner.java:939)
at java.base/java.util.Scanner.next(Scanner.java:1594)
at java.base/java.util.Scanner.nextInt(Scanner.java:2258)
at java.base/java.util.Scanner.nextInt(Scanner.java:2212)
at ExcerciseOne.main(ExcerciseOne.java:65)


1 commentaires

Regardez la ligne où l'exception est lancée. Je parie que ce n'est pas dans le bloc ESSAYER BLOCK mais dans le bloc bloquer .


3 Réponses :


3
votes

Vous attrapez l'exception projetée dans la clause ESSAY CODE>, mais vous lisez ensuite à partir du scanner à l'intérieur du Attraper code> à nouveau et en jetant une autre exception, ce temps imprévu.

classSize = in.nextInt();


2 commentaires

D'accord. Je vois le problème, mais comment serait-il corrigé? Je veux fondamentalement l'utilisateur lorsque le bloc de capture est utilisé pour ré-entrer un numéro. Dois-je faire une capture d'essai dans une capture d'essai?


C'est ce que la boucle est pour, non? S'ils échouent, il sera en boucle à la clause . Je ne vois aucune raison de demander une entrée lors de la clause .



1
votes

Le in.NexTint () code> Invocation à l'intérieur du bloc CODE> Block lit le mauvais flux laissé derrière par la première invocation de in.Nexint () code > Dans le essayez code> bloc.

Ce que vous pouvez faire est de supprimer les appels .nexint () code> dans le bloc code> bloc: p> xxx pré>

ou mieux: p>

car INPUTMISMATCHEXCEPTION code> est une sous-classe de RunTimeException code>, le type d'erreur qui Jette cette erreur peut être filtrée par si code> déclarations. Comme vous n'avez besoin que d'un entier approprié comme entrée, vous pouvez valider l'entrée à l'aide d'une expression régulière. P>

boolean hasError = true;
String integerRegex = "[\\d]+"; // it means 1-to-many digits
while (hasError) {
    System.out.println("Hello! Please enter how many Students you have in your class: ");
    String input = in.nextLine();
    if (input.matches(integerRegex)) {
        classSize = Integer.parseInt(input);
        hasError = false;
    } else {
        System.out.println("Invalid input. please make sure you enter numbers ONLY! No symbols or letters.");
        // variable hasError remains true
    }
}


1 commentaires

Bon rapport qualité prix Répondre sur différents types d'exceptions.



1
votes

La réponse de Gendarme est claire et j'ajoute une démonstration correcte pour vous:

  public static void main(String[] args) {
      int studentsCount = 0;
      boolean hasError;
      do {
        try {
          System.out.println("Hello! Please enter how many Students you have in your class: ");
          Scanner in = new Scanner(System.in);
          studentsCount = in.nextInt();
          hasError = false;
        } catch (InputMismatchException e) {
          System.out.println("--> Invalid input. please make sure you enter numbers ONLY! No symbols or letters.");
          hasError = true;
        }
      } while (hasError);
      System.out.println("There are " + studentsCount + " students in your class.");
  }


0 commentaires