我正在尝试编写一个测试程序来测试一系列数字是否是一个魔术方块。但是,我正在试图弄清楚如何正确验证用户输入。简而言之,我想提示用户输入一个整数并继续这样做,直到他们输入字母'x'。如果他们在完成之前不小心输入了一个字母而不是x,我希望程序在允许继续输入之前给他们一个简短的错误,直到输入x。
这就是我现在所拥有的:
public class TestSquare
{
public static void main(String [] args)
{
Square numbers = new Square();
Scanner in = new Scanner(System.in);
System.out.println("Enter an integer(x to exit): ");
int i = in.nextInt();
char c = (char)(i + '0');
while(Character.isDigit(c))
{
numbers.add(i);
System.out.println("Enter an integer(x to exit): ");
i = in.nextInt();
c = (char)(i + '0');
}
if( c == 'x')
{
numbers.isSquare();
numbers.isUnique();
numbers.isMagic();
}
else
{
System.out.println("***Invalid Data Entry. Please Try Again or enter x to exit.***");
i = in.nextInt();
c = (char)(i + '0');
}
}
}
这让我可以连续输入整数,但是当我输入一个字母(包括x)时,程序会遇到错误并停止。
答案 0 :(得分:0)
while (Character.isDigit(c)) {
numbers.add(i);
try {
System.out.println("Enter an integer(x to exit): ");
i = in.nextInt();
c = (char) (i + '0');
} catch (java.util.InputMismatchException e) {
if (c == 'x') {
numbers.isSquare();
numbers.isUnique();
numbers.isMagic();
System.exit(0);
} else {
System.out.println("***Invalid Data Entry. Please Try Again or enter x to exit.***");
in = new Scanner(System.in);
continue;
}
}
}
我在while循环中添加了try和catch块。因此,如果用户输入字符,程序将不会崩溃。相反,控制将转到catch块。在这里你可以检查输入,如果它是char x,它不是一个整数。如果是,您可以使用System.exit(0);
停止执行,否则您可以继续该过程..
答案 1 :(得分:0)
无法检查是否c == 'x'
,因为您期望来自用户的int,并且如果用户输入除int之外的任何内容,则将抛出异常。但是没有办法找出用户输入的内容。要避免此问题,您可以让用户输入一些其他整数来退出。也许-1。
答案 2 :(得分:0)
当您确定输入将作为Scanner.nextInt()
时,仅使用int
。使用Scanner.next()
获取普通String
值。
回答此问题的关键是了解代码在不同类型之间进行转换的位置:String
,int
和char
。 (对这些东西保持清晰需要练习,但它是值得的:当你对类型有很好的认识时,它会更容易发现问题!)
int
类型是一种整数,可以保存低至-2,000,000,000且高达2,000,000,000的值。
char
类型是一种不同类型的整数,可以保存0到65,000之间的值,但这些值通常用于编码文本字符:'A'
是65,'B'
是66,'X'
是88而'x'
是120。
String
类型是一个对象,它在一行中包含一系列文本字符。它对"Hello"
之类的内容很有用,但即使字符看起来是数字,String
也是String
:"100"
是String
,有三个字符。
4
是int
,其值为4. '4'
是char
,其值为52。"4"
是String
长度为1. "4"
中的第一个字符是'4'
。Enter an integer(x to exit):
4
当您在键盘上键入数字 4 并按 Enter 时,实际上还不是int
。 java.util.Scanner
会将其视为String令牌。 (为了简单起见,我不会谈论System.input
看到它或Scanner
如何找到令牌。)
int i = in.nextInt();
java.util.Scanner nextInt()
方法将String
令牌(" 4")解析为int
(4)。
然后,发布的代码获取int
(4)并将其转换为char
(' 4'):
char c = (char) (i + '0');
这会将int
种整数添加到char
种整数中。在我们的示例中,由于i
为4且'0'
为48,因此程序会计算4 + 48 = 52
并将该数字52存储在名为char
的{{1}}广告位中。 (幸运的是,这些数字足够小,适合它们。)
因此,当输入流中的下一个c
令牌为String
时,代码会运行这两行:
"4"
到目前为止一切顺利。
int i = in.nextInt(); // "4" converted to 4
char c = (char) (i + '0'); // 4 converted to '4'
当您在键盘上键入字母 x 并按 Enter 时,故事会更短。
下一个标记是Enter an integer(x to exit):
x
String
。 "x"
方法Scanner
会读取令牌并尝试将其解析为nextInt()
,但int
不符合格式,因此"x"
会引发nextInt()
例外。
异常意味着程序中断正常的运行流程,将所有变量保留在原来的位置,并直接跳转到最接近的匹配InputMismatchException
块。如果没有匹配的catch
块可以跳转到,那么Java的默认块将会启动:打印异常,中止程序。
因此,当输入流中的下一个catch
令牌为String
时,代码会运行一行并在任何变量发生变化之前跳转:
"x"
关键点是,i = in.nextInt(); // throws exception, so i does not change
c = (char) (i + '0'); // never executed, so c does not change
只能帮助您处理Scanner.nextInt()
等文字,并且无法帮助您处理"400"
等文字。
"x"
类比Scanner
有更多方法。还有另外两种与此案例特别相关的方法:
nextInt()
(hasNextInt()
当下一个标记是" 400",true
当下一个标记是"你好")false
(给你下一个标记)普通的next()
是最重要的 - 它自己返回下一个next()
令牌。没有额外的转换。因此,如果下一个标记为String
,则"4"
将返回next()
。如果下一个标记为"4"
,则"x"
将返回next()
。
如果您想将输入作为文本处理 - 也就是说,如果您想要处理" x"不同于" a"或者"你好",这是要使用的那个:
"x"
事实上,String token = in.next();
if (token.equals("x")) {
System.out.println("Goodbye");
}
基本上是nextInt()
后跟next()
的快捷方式。
有了您对类型和转换的新的,更清晰的理解,您可能对如何处理各种格式的输入有一些想法。
也许你的新结构可能看起来像这个伪代码:
Integer.parseInt()
或者您可能会认为您根本不需要使用while there are more tokens available {
is the next token suitable for integer parsing? {
parse the next token as an integer
} else {
deal with the token in its plain string form
}
}
,而字符串" 4"足以满足您的目的。或者也许你可以直接转换为" 4"到' 4'。
世界是你的牡蛎!
在处理新代码时,您可能会发现以下一些提示:
int
"hello".charAt(0) == 'h'
"400".charAt(0) == '4'
如果你真的想确保你的类型在正确的地方,请考虑以下情况:
Integer.parseInt("400", 10) == 400
整数,不适合int
整数)