java - 扫描仪返回错误的 int 值

标签 java java.util.scanner

Java新手在这里。

我做了一个函数来简单地返回用户通过扫描仪给出的整数。
目标是在用户没有输入整数时避免错误,通知他们并让他们重试。

如果第一次尝试时该值是整数,则它工作正常,但如果我键入一个字符(得到错误,函数“重新启动”),则该函数将返回“默认”零。
尝试了不同的东西,但我绝对不明白这里的逻辑。

这是代码:

  //Initialize the Scanner earlier
  public static Scanner keyBoardRead = new Scanner(System.in);

  public static int intEntry()
  {
  int entry;
  keyBoardRead = new Scanner(System.in);
  if (keyBoardRead.hasNextInt() == true)
    {
    entry = keyBoardRead.nextInt();
    System.out.println("entry variable = "+entry);
    // Here the correct entry prints but doesn't seem to return
    return entry;
    }
  else
   {
    System.out.println("Invalid entry.\n");
    intEntry();
   }
  return 0;
  }

示例输出:
z
Invalid entry.

2
entry variable = 2

// Function exits and output = 0 (?!)

感谢您的帮助,请批评我的代码:)

最佳答案

我修改了你的代码,因为它有一些缺陷:

public static Scanner keyBoardRead = new Scanner(System.in);

public static int intEntry()
{
    int entry;
    if (keyBoardRead.hasNextInt())
    {
        entry = keyBoardRead.nextInt();
        System.out.println("entry variable = "+entry);
        // Here the correct entry prints but doesn't seem to return
        return entry;
    }
    keyBoardRead.next();
    System.out.println("Invalid entry.\n");
    return intEntry();
}

以下是更改说明:
  • 您无需重新申报 new Scanner(System.in)每次通话
    对于方法,您声明您最初将其声明为类字段,
    所以它应该每次都可以从方法内部访问。
  • 您的 else一般来说完全没有必要,因为你有一个 return在您的 if .如果您的 if被执行,之后它永远不会输入代码。
  • 您需要从 intEntry() 返回值与 return intEntry()因为目前您只是丢弃了 return值并简单地返回 0无条件如果 else甚至被执行一次。
  • 您需要使用 keyBoardRead.next()如果输入了无效条目以移动到下一个值并丢弃先前输入的结果。您也可以使用 keyBoardRead.nextLine()相反,如果您想丢弃整行。
  • 使用 == true boolean 值是多余的,因为您可以直接检查 boolean 值,因此 if (keyBoardRead.hasNextInt())而不是 if (keyBoardRead.hasNextInt() == true) .感谢@Joop Eggen 捕捉到它。

  • 示例运行:
    hi
    Invalid entry.
    
    wrong
    Invalid entry.
    
    entries
    Invalid entry.
    
    55
    entry variable = 55
    

    注意:输出中有很多空格,因为您使用的是 println并且还使用 \n在打印中,因此它将移动到下一行两次。

    您也可以轻松地创建此解决方案的变体,该变体使用 while循环而不是递归,这可能是一种更好的方法,因此您不可能遇到堆栈溢出(并且通常更容易阅读),但我保留了递归以使其与您的解决方案类似。

    关于java - 扫描仪返回错误的 int 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59720531/

    相关文章:

    java - JComboBoxKeySelectionManager 的使用

    java - 扫描仪在使用 next() 或 nextFoo() 后跳过 nextLine()?

    java - 使用扫描仪读取 csv 文件值,useDelimiter (";")不起作用

    Java Eclipse : My code's output is skipping a line and I don't know why

    Java:需要在 GUI 中获取输入行,仅在控制台中有效

    java - SonarQube 多模块代码覆盖率

    java - 无法在 Gauge 中解析动态参数

    Java Guava : Remove and put back elements from Multimap while iterating

    Java 摘要式身份验证 POST XML

    java - 将字符附加到加载到内存中的文件的最快/最有效的方法是什么?