我正在使用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.");
}
}
谢谢大家!
答案 0 :(得分:2)
尽管您的程序适用于有效输入,但是您可以通过检查无效的字符(例如非数字字符)来使它健壮,以防止输入数字。您的程序崩溃是有原因的:当用户在此行中输入字符串而不是数字时:
numberCups = scnr.nextFloat();
...,然后方法nextFloat()
将引发 exception ,确切地说是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
块中包装可能发生预期错误的代码,以便处理这种情况而不会不必要地使程序崩溃。请注意,有many types of Exceptions。您应该抓住可能发生的情况。
答案 1 :(得分:1)
您可以将nextFloat()
和nextInt()
更改为nextLine()
和Integer
,然后在Float
的try-catch块中尝试将它们转换为Integer.parseInt()
或Float.parseFloat()
1}}和type App {
id: Int
show: Show
...
}
type Show {
id: Int
name: String
...
}
。
答案 2 :(得分:1)
Ref:Only allow input of integers with java scanner
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;
}
答案 3 :(得分:0)
您最好的办法就是@ayrton所说的,使用scnr.nextLine()
而不是next()
或nextFloat()
。您可以始终使用Integer类的Integer.parseInt()
方法将字符串转换为Number。
希望这会有所帮助。