我正在用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块中的Integer
或Float
。
你能做的最好的事情就是@ayrton说的,使用scnr.nextLine()
而不是next()
或nextFloat()
。 您始终可以使用 Integer 类中的Integer.parseInt()
方法将字符串转换为数字。
希望这有帮助。