用户在 Java 中只输入数字,不输入文本



我正在用Java做一个食谱管理器项目,我有用户输入:成分的名称,每杯成分的卡路里,成分的杯子,最后程序将计算卡路里的总和。

我的问题是,如果用户输入字母或符号,则程序崩溃。我想知道我该如何解决这个问题。任何帮助都会很棒!

这是我的代码:

public static void main(String[] args) {
String nameOfIngredient = "";
float numberCups = 0;
int numberCaloriesPerCup = 0;
double totalCalories = 0.0;
Scanner scnr = new Scanner(System.in);
System.out.println("Please enter the name of the ingredient: ");
nameOfIngredient = scnr.next();
System.out.println("Please enter the number of cups of " + nameOfIngredient + " we'll need: ");
numberCups = scnr.nextFloat();

System.out.println("Please enter the name of calories per cup: ");
numberCaloriesPerCup = scnr.nextInt();
totalCalories = numberCups * numberCaloriesPerCup;
System.out.println(nameOfIngredient + " uses " + numberCups + " cups and has " + totalCalories + " calories.");
}

}

谢谢大家!

尽管您的程序适用于有效的输入,但您可以通过检查无效的输入(如需要数字的非数字(来使其健壮。您的程序崩溃是有原因的:当用户在此行中输入字符串而不是数字时:

numberCups = scnr.nextFloat();

。然后nextFloat()的方法将引发异常,准确地说是NumberFormatException。Java 解释器无法处理此异常 - 当出现这种(有效(情况时,它不知道该怎么做。您可以对此采取一些措施:

do {
bool validInput = true;
try {
numberCups = scnr.nextFloat();
}
catch(NumberFormatException ex) {
validInput = false;
System.out.println("Please enter a number.");
}
} while(!validInput);

现在,Java将try执行nextFloat,如果它因NumberFormatException而失败,它将执行catch块。这使您有机会告诉用户他们的输入是错误的。我将所有内容都放在一个循环中,以便当出现异常时,循环只是再次运行,直到输入有效的数字。请注意,如果未出现异常,则永远不会执行catch块。

最好在此类try块中可能发生预期错误的地方包装代码,以便在不必要地使程序崩溃的情况下处理这种情况。请注意,有许多类型的异常。你应该抓住你期望可能发生的那个。

Ref : 只允许使用 java 扫描程序输入整数

boolean testing = false;
String pos = "";
while(true)
{
testing = false;   
Scanner sc = new Scanner(System.in);
System.out.println("Enter the integer value.... ");
pos = sc.next();
for(int i=0; i<pos.length();i++)
{
if(!Character.isDigit(pos.charAt(i)))
testing = true;
}
if(testing == true)
{
System.out.print("Enter only numbers..   ");
continue;
}
else
{
int key = Integer.parseInt(pos);
// Your code here....
break;
}

您可以更改nextLine()nextFloat()nextInt(),然后尝试使用Integer.parseInt()Float.parseFloat()将它们转换为try-catch块中的IntegerFloat

你能做的最好的事情就是@ayrton说的,使用scnr.nextLine()而不是next()nextFloat()。 您始终可以使用 Integer 类中的Integer.parseInt()方法将字符串转换为数字。

希望这有帮助。

相关内容

  • 没有找到相关文章

最新更新