当前位置: 首页 > 知识库问答 >
问题:

为什么此扫描程序将 null 赋给变量?

萧伟兆
2023-03-14

对于大学评估,我必须使用一个名为sc的扫描器,具有班级范围,整个课程必须包含在一个班级中。main方法调用菜单()方法,该方法使用Scanner和for循环调用两种方法之一以响应用户输入。

这两种方法之一使用扫描仪来计算输入整数的阶乘。执行该方法后,menu() 中的 for 循环将继续。为了避免由于用户输入浮点数而导致的输入不匹配异常,我使用了try/catch。但是,当程序返回到 menu() for 循环时,扫描程序在分配选项时会导致输入不匹配异常。如何让扫描仪再次提示用户输入?如果我错过了一些明显的东西,很抱歉,这是我学过的第一门编程语言。这应该是精简的可编译代码:

package summativeassessment;

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

public class SummativeAssessment {

    private static Scanner sc = new Scanner(System.in);

    public static void main(String[] args) {
        menu();
    }

    public static void menu(){
        String fName;
        String sName;

        System.out.print("Enter your first name: ");
        fName = sc.next();
        System.out.print("Enter your last name: ");
        sName = sc.next();

        try{
            for(int choice = 1; choice!=0;){
              System.out.print("Option 1 to generate username. Option 2 to calculate factorial. Press 0 to quit: ");
              choice = sc.nextInt();
              switch(choice){
                  case 2:
                      System.out.println(fName+" "+sName+", you have selected option 2");
                      numberFactorial();
                      break;
                  case 0:
                      break;
                  default:
                      System.out.println("Invalid option. Please try again.");
              }
            }
        } catch(InputMismatchException ex){
            String msg = ex.getMessage();
            System.out.println(msg);
        }
    }

    public static void numberFactorial(){
        System.out.print("Enter a number: ");
        try{
            int numIn = sc.nextInt();
            long result = numIn;
            if(numIn>0){

                for(int factor = 1; factor<numIn; factor++){
                    result *= factor;
                    if(factor==numIn-1){
                        System.out.println("The factorial is "+result);
                    }
                }
            }
            else{
                System.out.println("Enter a positive integer greater than 0");
            }
        }
        catch(InputMismatchException ex){
            System.out.println("Input invalid");
        }
    }
}

共有1个答案

狄令
2023-03-14

我调试了你的代码,得到了这个结果:

如果您将浮点数作为输入输入,则会触发InputMismatchException,但缓冲区中仍有一些东西。因此,下次调用sc.nextInt()时,它不会等到您输入一个值,因为缓冲区中已经有一些东西,因此它会从缓冲区中取出下一个值并尝试将is解释为整数。但是,它失败了,因为它不是整数,因此再次引发InputMismatchException并在您的菜单捕获中捕获,现在导致程序退出。

解决方案是绘制第一次引发异常后缓冲区中剩余的任何内容。

因此,工作代码将在异常中包含缓冲区清除 sc.next():

    public static void numberFactorial(){
    System.out.print("Enter a number: ");
    try{
        int numIn = sc.nextInt();
        long result = numIn;
        if(numIn>0){

            for(int factor = 1; factor<numIn; factor++){
                result *= factor;
                if(factor==numIn-1){
                    System.out.println("The factorial is "+result);
                }
            }
        }
        else{
            System.out.println("Enter a positive integer greater than 0");
        }
    }
    catch(InputMismatchException ex){
        System.out.println("Input invalid");
        sc.next();
    }
}
 类似资料:
  • 输出为“假”,但为什么?我将<code>truetruevs什么时候合适? 编辑:一些用户提到我应该看到错误,但我没有。我在PowerShell 2.0(Windows 7)和PowerShell 4.0(Windows 8.1)中都尝试过。和确实像我说的那样更改了COM属性。 编辑:事实证明,我们将< code>true赋给了COM属性,但它们实际上收到了false。我们的路径中有gnuwin3

  • 问题内容: 我一直在使用IIFE中和,并一直在使用的结构如下: 方法1: 但是,我经常看到以下情况,其中将变量分配给 方法2: 注意: 此问题 不是 关于此模式是什么或IIFE是什么。这与为什么要 在IIFE上 使用返回变量及其与Angular实践的关系有关。 在Angular方法1中工作正常,但是在我看到的许多原始JS示例中,都使用了方法2。我的假设是,封装在其中的任何内容都可以通过它进行调用。

  • 问题内容: 为什么经常被称为 代替 ? W3,MDN和MSDN都声明它是可选的。此外,ActiveX控件似乎不需要参数: 这种做法至少可以追溯到2005年的Google Maps中 ,但被缩小了,没有任何解释: 问题答案: 如果您看一下XMLHttpRequest的旧规范,似乎W3C似乎并不需要在某一点上将该参数设为可选,这可能导致人们提供了一个明确的null值,以防万一。 (搜索“应支持发送”)

  • 我正在将一个变量赋给一个数组,它是我在刀片文件中声明的。它返回一个错误 下面是我的代码: 我无法理解这个错误。谢谢!

  • 我想把列表中的对象分配给类变量。 感恩节:)

  • 我写了一个小程序,它检查字符串是否按照用户输入的字母顺序排序,并用空白隔开一行。它的工作,这是伟大的,但我不明白的是,为什么我可以使用扫描器创建数组时,大小还没有设置。任何见解都将不胜感激。