扫描仪返回错误的 int 值

Pab*_*blo 4 java java.util.scanner

Java新手在这里。

我创建了一个函数来简单地返回用户通过 Scanner 给出的 int 。目标是避免用户未键入整数时出现错误,通知他们并让他们重试。

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

这是代码:

  //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;
  }
Run Code Online (Sandbox Code Playgroud)

示例输出:

z
Invalid entry.

2
entry variable = 2

// Function exits and output = 0 (?!)
Run Code Online (Sandbox Code Playgroud)

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

Nex*_*vis 5

我对你的代码进行了一些修改,因为它存在一些缺陷:

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();
}
Run Code Online (Sandbox Code Playgroud)

以下是对这些变化的解释:

  • 您不需要new Scanner(System.in)在每次调用方法时都重新声明,您声明您最初将其声明为类字段,因此每次都应该可以从方法内部访问它。
  • else一般来说,你的陈述是完全没有必要的,因为return你的if. 如果你的if被执行了,无论如何它都不会再输入代码。
  • intEntry()您需要从with返回值,return intEntry()因为当前您只是丢弃该return值并简单地0无条件返回 ifelse执行一次。
  • 您需要使用keyBoardRead.next()是否输入了无效条目,以便移至下一个值并丢弃先前输入的结果。keyBoardRead.nextLine()如果您希望放弃整行,也可以使用代替。
  • 使用== true布尔值是多余的,因为您可以直接检查布尔值,因此if (keyBoardRead.hasNextInt())不用if (keyBoardRead.hasNextInt() == true). 感谢@Joop Eggen 捕捉到了它。

运行示例:

hi
Invalid entry.

wrong
Invalid entry.

entries
Invalid entry.

55
entry variable = 55
Run Code Online (Sandbox Code Playgroud)

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

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