扫描仪 returns 错误的 int 值
Scanner returns wrong int value
Java这里是新手。
我做了一个函数来简单地 return 一个由用户通过 Scanner 给出的 int。
目标是避免在用户未键入整数时发生错误,通知他们并让他们重试。
如果第一次尝试时该值是一个整数,它工作正常,但如果我输入一个字符(得到一个错误,函数 "restart")然后函数将 return "default" 零。
尝试了不同的东西,但我绝对不明白这里的逻辑。
代码如下:
//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)
对于该方法,您声明您最初将其声明为 class 字段,
所以每次都应该可以从方法内部访问它。
- 您的
else
声明通常是完全没有必要的,因为您的 if
中有一个 return
。如果你的if
被执行了,无论如何它之后都不会输入代码。
- 您需要 return 来自
intEntry()
的值与 return intEntry()
因为目前您只是丢弃 return
值并简单地 returning 0
无条件如果 else
只执行一次。
- 如果输入的条目无效,您需要使用
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
注意:您在输出中有很多空白 space,因为您在打印所以它会移动到下一行两次.
您还可以轻松地为该解决方案创建一个变体,它使用 while
循环而不是递归,这可能是一种更好的方法,因此您不可能 运行 进入堆栈溢出(并且通常更容易阅读),但我保留了递归以使其与您的解决方案相似。
Java这里是新手。
我做了一个函数来简单地 return 一个由用户通过 Scanner 给出的 int。 目标是避免在用户未键入整数时发生错误,通知他们并让他们重试。
如果第一次尝试时该值是一个整数,它工作正常,但如果我输入一个字符(得到一个错误,函数 "restart")然后函数将 return "default" 零。 尝试了不同的东西,但我绝对不明白这里的逻辑。
代码如下:
//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)
对于该方法,您声明您最初将其声明为 class 字段, 所以每次都应该可以从方法内部访问它。 - 您的
else
声明通常是完全没有必要的,因为您的if
中有一个return
。如果你的if
被执行了,无论如何它之后都不会输入代码。 - 您需要 return 来自
intEntry()
的值与return intEntry()
因为目前您只是丢弃return
值并简单地 returning0
无条件如果else
只执行一次。 - 如果输入的条目无效,您需要使用
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
注意:您在输出中有很多空白 space,因为您在打印所以它会移动到下一行两次.
您还可以轻松地为该解决方案创建一个变体,它使用 while
循环而不是递归,这可能是一种更好的方法,因此您不可能 运行 进入堆栈溢出(并且通常更容易阅读),但我保留了递归以使其与您的解决方案相似。