我一直在为我的java类做一个项目。对于项目,我必须让用户输入输入并计算他们的体重指数和体表面积,程序应该保持运行直到用户输入“q”。当一个“q”被放入它时,我无法让我的程序停止运行。另外我对java和编程也很新,所以我将不胜感激。我的代码如下。 谢谢:))
public static void main(String[] args) {
//Scanner
Scanner stdIn = new Scanner(System.in);
//Variables
final double METERS_TO_CM = 100; // The constant to convert meters to centimeters
final double BSA_CONSTANT = 3600; // The constant to divide by for bsa
double bmi; // Body Mass Index
String weight; // Weight in kilograms
String height; // Height in meters
String classification; // Classifies the user into BMI categories
double bsa; // Body surface area
do {
System.out.print("Welcome to the BMI and BSA Calculator to begin enter weight in kilograms.");
weight = stdIn.next();
System.out.print("Enter height in meters: ");
height = stdIn.next();
double height2 = Double.parseDouble(height);
double weight2 = Double.parseDouble(weight);
bmi = weight2/(height2*height2);
if (bmi < 18.5)
{
classification = "Underweight";
}
else if (bmi < 25)
{
classification = "Normal";
}
else if (bmi < 30)
{
classification = "Overweight";
}
else
{
classification = "Obese";
}
System.out.println("Your classification is: " + classification);
bsa = Math.sqrt(((height2*METERS_TO_CM)*weight2)/BSA_CONSTANT);
System.out.printf("BMI: %.1f\n", bmi);
System.out.printf("BSA: %.2f\n", bsa);
System.out.println("Hit 'q' to quit");
} while (stdIn.nextLine().compareToIgnoreCase("q")==0);
}
}
答案 0 :(得分:1)
我猜你的“q”输入是用weight
编写的,因此你试图将它解析为Double,它抛出一个未处理的异常并停止执行。
你应该处理这个异常并让系统在触发时打破while循环。
答案 1 :(得分:1)
你正在为你的while循环条件抓住整行。
尝试抓住next()
代替nextLine()
。
另外,你看着它等于0 ......意思相等。我会将其更改为!=
。您希望在下一个令牌不是Q时继续循环。
答案 2 :(得分:0)
让我们进行结构性改变,让您更容易做到。
我们将更改它,以便您的do-while循环始终运行,直到您明确告诉它停止。
你现在的时间是:
while(stdIn.nextLine().compareToIgnoreCase("q")==0);
哪个有效,但我们有一个更简单的方法来做到这一点。你听说过break
陈述吗?
我建议您使用break。这句话将“打破”你的while循环;基本上它告诉程序在调用时停止循环。这比你有点混乱的做法更容易理解。
do {
//Your Do code goes here, as before
...
//
//Your newly added break statement will go here.
//This breaks out of the while loop when your inputed 'choice' value is
//equal to the string of "q" (for quit)
if (Choice.equals("q"))){
break;
//When break is called nothing else in the loop will run
}
//Same thing but with the string of "quit"
if (Choice.equals("quit"){
break;
}
}while (true);
//Your new while statement is simply while(true) which will run until break is called
希望这对你有所帮助。
答案 3 :(得分:0)
实际上不要使用循环。由于通过回答太多问题而无法将呼叫堆栈最大化是不切实际的,只需使整个操作成为一个功能即可。在函数结束时,如果结果不是Q,则调用自身。
答案 4 :(得分:0)
简单使用这个
while (true)
{
Console.WriteLine("Start processing");
//processing code here
Console.WriteLine("finish processing");
Console.WriteLine("start again? y/n?");
if (Console.ReadLine().Equals("n"))
break;
}