1

以下代码在一个 while 循环中,该循环中包含一个这样的开关:

  System.out.println("Enter in a selection.");
  System.out.println("Enter \"1\" for a default selection of die");
  System.out.println("Enter \"2\" for a custom number of sides.");
  //try the input to see if its an integer
  try {
  selection = sc.nextInt();
  } catch (NumberFormatException e){
      System.out.print("Your selection can only be an integer!");
   } 
 switch (selection){
   case1:
   ...
   break;

   case2:
   ...
   break;

   default:
   ...
   //yell at them
   continue;
  }

我已经在开关中有一个默认选择,因此如果用户输入了一个无效的数字,比如 4(因为只有 2 种情况),它会将它们带回到循环的开头。所以,问题是处理异常。上面的代码没有处理异常,我不知道为什么。尝试是容纳有问题的代码。

与往常一样,如果需要,请要求澄清。谢谢。

4

6 回答 6

1

您应该对异常进行处理,因为如果发生异常continue,则继续进行是没有意义的。switchselection

} catch (InputMismatchException e){
    System.out.print("Your selection can only be an integer!");
    sc.nextLine();
    continue;
}

您现在拥有它的方式,如果发生异常,您将切换selection.


但是您的代码中的主要问题是该nextInt()方法不会抛出NumberFormatException,而是抛出InputMismatchException.

所以你试图捕捉错误的异常

于 2012-11-04T01:56:23.040 回答
1

输入时未处理异常的原因4是它4是一个有效的整数并且nextInt()不会引发NumberFormatException异常。

你最好把switch它附在try块里。

于 2012-11-04T01:59:38.720 回答
1

就个人而言,我会将您的输入(以及随之而来的 try/catch 块)放在它自己的单独方法中。返回布尔值(true = 有效整数)或超出范围的值(可能为“-1”,具体取决于您的程序)。

恕我直言...

于 2012-11-04T02:01:16.540 回答
1

Scanner#nextInt()不抛出NumberFormatException

Scans the next token of the input as an int. An invocation of this method of the form nextInt() behaves in exactly the same way as the invocation nextInt(radix) , where radix< is the default radix of this scanner.

 return the int scanned from the input
 throws InputMismatchException
         if the next token does not match the <i>Integer</i>
          regular expression, or is out of range
 throws NoSuchElementException if input is exhausted
 throws IllegalStateException if this scanner is closed

您的异常处理似乎是正确的,唯一的问题是您捕获了错误的异常。请抓住InputMismatchException和其他两个。

例如下面:

    try {
          selection = sc.nextInt();
      } catch (InputMismatchException e){
          System.out.print("Your selection can only be an integer!");
      }

此外,您可能希望将上述代码放入 while 循环中,如下所示:

       boolean validInput = false;
       while(!validInput){
     try {
          selection = sc.nextInt();
              validInput = true;
      } catch (InputMismatchException e){
          System.out.print("Your selection can only be an integer!");
      }
       }

这将重复要求输入,直到输入一个数字。

于 2012-11-04T02:19:09.633 回答
0

在 a 的情况下Scanner,您可以使用该hasNextInt()方法(以及其他数据类型的等效方法),而不是通过异常崩溃和烧毁:

while (some_condition) {
  System.out.println("Enter in a selection.");
  System.out.println("Enter \"1\" for a default selection of die");
  System.out.println("Enter \"2\" for a custom number of sides.");
  //try the input to see if its an integer
  if (!sc.hasNextInt()) {
    System.out.println("You must enter an integer!");
    continue;
  }
  selection = sc.nextInt();

  switch (selection){
   case 1:
   ...
   break;

   case 2:
   ...
   break;

   default:
   ...
   //yell at them
   continue;
  }
}

正如Bhesh Gurung 所说,如果你处于一个循环中,你应该使用continueto 回到开头,就像你在default案例中所做的那样。

于 2012-11-04T02:00:09.067 回答
0

如果你想真正处理'switch'语句中的异常,你需要扩展try-catch块的范围:

  System.out.println("Enter in a selection.");
  System.out.println("Enter \"1\" for a default selection of die");
  System.out.println("Enter \"2\" for a custom number of sides.");
  //try the input to see if its an integer
  try {
  selection = sc.nextInt();

  switch (selection){
   case1:
   ...
   break;

   case2:
   ...
   break;

   default:
   ...
   //yell at them
   throw new NumberFormatException("Yelling message");
   continue;
  }
 } catch (NumberFormatException e){
      System.out.print("Your selection can only be an integer!");
 } 
于 2012-11-04T02:12:21.243 回答