我正在尝试使一个小程序更健壮,我需要一些帮助。
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必须大于数字
此外,我希望程序自动检查并忽略用户是否输入字符而不是数字。因为现在当用户输入例如r
而不是数字时,程序就会退出。
答案 0 :(得分:30)
如果使用
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()
,如上所示。
答案 1 :(得分:4)
String
然后try
Integer.parseInt()
,如果你没有catch
例外,那么它就是数字,如果你这样做,可以通过将num2设置为Integer.MIN_VALUE并在示例中使用相同类型的逻辑来读取新数字。答案 2 :(得分: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);
}
}
答案 3 :(得分: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");
}
}
}
您也可以尝试将字符串解析为int
,但通常人们会尝试避免抛出异常。
我所做的是我定义了一个定义数字的正则表达式,\d
表示数字。 +
符号表示必须有一个或多个数字。 \
前面的额外\d
是因为在java中,\
是一个特殊字符,因此必须对其进行转义。
答案 4 :(得分:0)
我看到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();
答案 5 :(得分:0)
您可以做的是将下一个标记作为字符串converts this string to a char array,并测试each character in the array is a digit。
如果您不想处理异常,我认为这是正确的。