这是一个很难研究的问题,所以请原谅我这是否重复。
基本上,我有一个while循环,只有在用户扫描的代码是整数时才会中断。我通过尝试Integer.parseInt(integer)
来检查这一点,并且只有在没有抛出NumberFormatException时才会中断循环。
我的问题是,当循环第一次执行时,抛出异常,没有任何用户输入。
这是我的代码:
Scanner input = new Scanner(System.in);
while (true)
{
System.out.print("Please scan barcode: ");
int inCode = 0;
try
{
inCode = Integer.parseInt(input.next());
}
catch (NumberFormatException e)
{
System.out.println("Numbers only, please.");
}
if (inCode != 0) {
// Do Stuff
} else {
System.out.println("Code can't be zero!");
}
}
应该发生什么,是这样的:
请扫描条形码:
// And here they enter the barcode
但反过来会发生这种情况:
请扫描条形码:仅限数字。
请扫描条形码:
修改
根据Bohemian的回答,我在代码中添加了continue
关键字。这解决了这个问题,但只有一半。根据我提出问题的人的要求(有充分的理由,正如我现在所看到的)我将为你们发布一个SSCCE。我将删除与数据库接口的方法,但只保留有问题的路径:根据代码创建一个新帐户。
Scanner input = new Scanner(System.in);
while (true)
{
System.out.print("Please scan barcode: ");
int inCode = 0;
try
{
inCode = Integer.parseInt(input.next());
}
catch (NumberFormatException e)
{
System.out.println("Numbers only, please.");
continue;
}
if (true) // Here it checks if an account associated with the code entered exists in the database. Because I'm having issues when it creates a new account, I've made this true.
{
System.out.println("No account associated with that code! Create one?");
System.out.print("(yes/no): ");
String answer = input.next();
if (answer.equalsIgnoreCase("yes"))
{
System.out.println("Alright.");
System.out.print("Please enter a name: ");
String name = input.next();
System.out.print("Alright. Now I'll add that to the database... ");
// Here I add that to the database. Omitted.
System.out.println("Done! Please scan again to interface.");
}
else if (answer.equalsIgnoreCase("no"))
{
System.out.println("Okay then.");
}
else
{
System.out.println("Defaulting to no.");
}
}
}
// I still haven't written the code to interface with the account.
现在发生了什么,它说(在第一次迭代中)
请扫描条形码:
但是,在完成添加帐户的过程后,它再次循环并说:
请扫描条形码:仅限数字。
请扫描条形码:
修改
请注意,所有内容都在while
循环中,因此当用户完成的所有内容完成后,它将返回到:
请扫描条形码:
答案 0 :(得分:2)
我认为你想要的是:
Scanner input = new Scanner(System.in);
while (true) {
System.out.print("Please scan barcode: ");
int inCode = 0;
try {
inCode = Integer.parseInt(input.next());
if (inCode != 0) {
// Do Stuff
break;
}
} catch (NumberFormatException e) {
System.out.println("Numbers only, please.");
}
}
答案 1 :(得分:1)
您拥有的代码可以更好地构建,这样可以更清楚地发现正在发生的事情并更容易追踪问题。您只想循环数据输入 - 所以只需循环数据输入:
int inCode = 0;
while (true) {
System.out.print("Please scan barcode: ");
try {
inCode = Integer.parseInt(input.next());
break;
} catch (NumberFormatException e) {
System.out.println("Numbers only, please.");
}
}
// Do stuff
您应该考虑使用scanner.hasNextInt()
和scanner.nextInt()
而不是scanner.next()
。这也将避免使用像这样的例外。通常使用Exceptions控制程序流是一个坏主意 - 实际上它们应该用于处理特殊情况。 Integer.parseInt
没有给你任何替代方案,但扫描仪会这样做。
答案 2 :(得分:1)
编辑完成后,很清楚问题是什么:你的while (true)
循环中没有break
语句,所以它会一直循环。
就个人而言,我建议将大部分代码移出循环,只保留条形码解析代码,例如:像这样:
int inCode;
while (true) {
System.out.print("Please scan barcode: ");
try {
inCode = Integer.parseInt(input.next());
if (inCode == 0) {
System.out.println("Code can't be zero!");
} else {
break; // we got a valid barcode! end the loop and move on...
}
} catch (NumberFormatException e) {
System.out.println("Numbers only, please.");
// no need for a "continue" here, since the loop will restart anyway
}
}
// rest of the code here...
或甚至可能:
int inCode;
while (true) {
System.out.print("Please scan barcode: ");
try {
inCode = Integer.parseInt(input.next());
} catch (NumberFormatException e) {
System.out.println("Numbers only, please.");
continue;
}
if (inCode == 0) {
System.out.println("Code can't be zero!");
continue;
}
break; // we have a valid barcode! end the loop and move on...
}
// rest of the code here...
答案 3 :(得分:0)
如果输入错误,我只会continue
循环,然后您不需要稍后测试它:
while (true) {
System.out.print("Please scan barcode: ");
int inCode = 0;
try {
inCode = Integer.parseInt(input.next());
} catch (NumberFormatException e) {
System.out.println("Numbers only, please.");
continue; // ADDED THIS LINE
}
// Do Stuff with inCode
}
请注意,通过输入后的代码测试为零,可以将零作为有效输入排除。此代码允许任何数字,包括零。小点,但不用担心边缘情况。
答案 4 :(得分:0)
你可以试试这个
String in=null;
while (true) {
System.out.print("Please scan barcode: ");
int inCode = 0;
try {
in= input.next();
inCode=Integer.parseInt(in);
} catch (NumberFormatException e) {
System.out.println("Numbers only, please.");
}
if (inCode != 0) {
// Do Stuff
} else {
// Repeat loop
}
或者您可以通过Scanner对象直接读取整数,而不是使用Integer.parseInt()
方法。
int inCode=0;
while(true) {
System.out.print("Please scan barcode : ");
inCode=input.nextInt();
if(inCode!=0){ //do stuff }
else { //Repeat Loop }
}