提问人:John 提问时间:5/26/2010 最后编辑:IvarJohn 更新时间:2/1/2020 访问量:280889
如何使用 Scanner 仅接受有效的 int 作为输入
How to use Scanner to accept only valid int as input
问:
我正在尝试使一个小程序更加健壮,我需要一些帮助。
Scanner kb = new Scanner(System.in);
int num1;
int num2 = 0;
System.out.print("Enter number 1: ");
num1 = kb.nextInt();
while(num2 < num1) {
System.out.print("Enter number 2: ");
num2 = kb.nextInt();
}
数字 2 必须大于数字 1
此外,我希望程序自动检查并忽略用户是否输入字符而不是数字。因为现在,例如,当用户输入而不是数字时,程序就会退出。
r
答:
4赞
Ledhund
5/26/2010
#1
- 如果 num2 必须大于 num1,则条件 num2 < num1 应为 num2 <= num1
- 不知道 kb 对象是什么,我会读一个,然后读 ing,如果你没有异常,那么它是一个数字,如果你这样做,读一个新的,也许通过将 num2 设置为 Integer.MIN_VALUE 并在你的示例中使用相同类型的逻辑。
String
try
Integer.parseInt()
catch
2赞
npinti
5/26/2010
#2
试试这个:
public static void main(String[] args)
{
Pattern p = Pattern.compile("^\\d+$");
Scanner kb = new Scanner(System.in);
int num1;
int num2 = 0;
String temp;
Matcher numberMatcher;
System.out.print("Enter number 1: ");
try
{
num1 = kb.nextInt();
}
catch (java.util.InputMismatchException e)
{
System.out.println("Invalid Input");
//
return;
}
while(num2<num1)
{
System.out.print("Enter number 2: ");
temp = kb.next();
numberMatcher = p.matcher(temp);
if (numberMatcher.matches())
{
num2 = Integer.parseInt(temp);
}
else
{
System.out.println("Invalid Number");
}
}
}
您也可以尝试将字符串解析为 an,但通常人们会尽量避免抛出异常。int
我所做的是,我定义了一个正则表达式,它定义了一个数字,即一个数字。该符号表示必须有一个或多个数字。前面的额外部分是因为在 java 中,the 是一个特殊字符,所以必须转义。\d
+
\
\d
\
3赞
aioobe
5/26/2010
#3
这应该有效:
import java.util.Scanner;
public class Test {
public static void main(String... args) throws Throwable {
Scanner kb = new Scanner(System.in);
int num1;
System.out.print("Enter number 1: ");
while (true)
try {
num1 = Integer.parseInt(kb.nextLine());
break;
} catch (NumberFormatException nfe) {
System.out.print("Try again: ");
}
int num2;
do {
System.out.print("Enter number 2: ");
while (true)
try {
num2 = Integer.parseInt(kb.nextLine());
break;
} catch (NumberFormatException nfe) {
System.out.print("Try again: ");
}
} while (num2 < num1);
}
}
0赞
Ilya Saunkin
5/26/2010
#4
我看到 Character.isDigit 完全符合需求,因为输入将只是一个符号。 当然,我们没有关于这个 kb 对象的任何信息,但以防万一它是一个 java.util.Scanner 实例,我还建议使用 java.io.InputStreamReader 进行命令行输入。下面是一个示例:
java.io.BufferedReader reader = new java.io.BufferedReader(new java.io.InputStreamReader(System.in));
try {
reader.read();
}
catch(Exception e) {
e.printStackTrace();
}
reader.close();
38赞
polygenelubricants
5/26/2010
#5
如果可以使用该方法将此扫描程序输入中的下一个标记解释为默认基数中的值,则返回。扫描仪不会前进到任何输入。
true
int
nextInt()
下面是一个片段来说明:
Scanner sc = new Scanner(System.in);
System.out.print("Enter number 1: ");
while (!sc.hasNextInt()) sc.next();
int num1 = sc.nextInt();
int num2;
System.out.print("Enter number 2: ");
do {
while (!sc.hasNextInt()) sc.next();
num2 = sc.nextInt();
} while (num2 < num1);
System.out.println(num1 + " " + num2);
您不必或担心.请注意,由于这些方法不会超过任何输入,因此如果要跳过“垃圾”,则可能需要调用,如上所示。parseInt
NumberFormatException
hasNextXXX
next()
相关问题
评论
0赞
TeachMeJava
10/11/2018
您可以使用其他数据类型,例如双精度引用类型。对于意图:“scanner.hasNextDouble()”
0赞
LB40
5/26/2010
#6
您还可以将下一个标记作为 String,将此字符串转换为 char 数组,并测试数组中的每个字符是否为数字。
我认为这是正确的,如果你不想处理例外情况。
评论
new Scanner(System.in)