我如何在这里捕获 InputMismatchException?

How am I catching an InputMismatchException here?

我正在尝试捕获 InputMismatch 异常并显示一条消息,告诉我异常发生的位置以及需要什么类型的输入。我需要这个循环直到输入正确的输入。我通过递增“statusCode”和“expectedCode”来做到这一点(这是 statusCode 必须退出循环。expectedCode 在每个循环之前递增,并且statusCode 在每个方法的末尾递增。我将与异常相关的方法和数据放在不同的 class 中,以便以后更容易访问。

当我第一次输入正确的输入(一个整数)时,它按预期工作。但是,如果我输入不兼容的数据,我首先会得到一个额外的空白输入行,然后在输入之后,我的异常就会被捕获。问题是之后的所有输入都抛出异常,无论我输入什么,我都无法继续。

之前声明了一个名为 trackExceptionTracker 对象。 这是相关代码:

  track.incrementExpected();          //expectedCode=1
  while(track.getStatusCode()!=track.getExpectedCode())
  {
     try
     {
        setGuests();            //statusCode=1 if successful
     }
     catch(InputMismatchException mis)
     {
        track.eventException();
     }
  }

setGuests() 方法:

   public void setGuests()
   {
      guests=0;
      
      while(guests<5||guests>100)
      {
         System.out.print("How many guests will be attending? ");
         guests=input.nextInt();
         input.nextLine();
         if(guests<5)
            System.out.println("Events for fewer than 5 guests are not accepted.");
         else
            if(guests>100)
               System.out.println("Events for greater than 100 guests are not accepted.");
      }
      
      if(guests>=CUTOFF)
         PPG=BPPG;
      else
         PPG=SPPG;
      price=guests*PPG;
      track.incrementStatus();            //statusCode=1
   }

在 ExceptionTracker class:

   public void incrementExpected()
   {
      ++expectedCode;
   }
   
   public void incrementStatus()
   {
      ++statusCode;
   }
   
   public void eventException()
   {
      input.nextLine();
      System.out.println("Error code: "+statusCode);
      switch(statusCode)
      {
         case 3:
         case 1:
            System.out.println("Input must be of type int.");
            break;
         
         case 2:
         case 0:
            System.out.println("Input must be of type String.");
            break;
      }
  }

感谢您的帮助。

编辑: 堆栈轨迹如下

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 Event.setGuests(Event.java:106)
    at Event.<init>(Event.java:38)

听起来他没有丢弃你的旧输入。确保在循环圈重新开始时将其重置。