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/