用户仅输入数字,而不输入Java中的文本

时间:2018-08-17 18:49:33

标签: java numbers user-input

我正在使用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.");

}

}

谢谢大家!

4 个答案:

答案 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。

希望这会有所帮助。