我对Java比较陌生,运行这个do-while循环时遇到了一些麻烦。
问题1
编写一个程序,允许用户转换给定的温度 从摄氏度到华氏度或华氏度到摄氏度。 使用以下公式:Degrees_C = 5(Degrees_F - 32)/ 9 Degrees_F =(9(Degrees_C)/ 5)+ 32提示用户输入 温度和C或c为摄氏度或F或f为 华氏度。如果是摄氏温度,则将温度转换为华氏温度 如果输入了华氏温度,则进入或摄入摄氏温度。显示结果 可读格式。如果输入C,c,F或f以外的任何内容, 打印错误信息并停止。
问题2
让我们继续问题1,但使用循环以便用户可以转换其他 温度。如果用户输入C或F以外的字母 大写或小写 - 温度后,打印错误信息和 要求用户重新输入有效选择。每次转换后,请询问 用户键入Q或q退出或按任何其他键重复 循环并执行另一次转换
public class Lab_4 {
public static void main(String arg[]) {
Scanner input = new Scanner(System.in);
double F; //Fahrenheit
double C; //Celsius
String method;
boolean keepGoing = true;
do {
System.out.println("Choose a method: ");
System.out.println("(F) Fahrenheit to Celsius. ");
System.out.println("(C) Celsius to Fahrenheit. ");
System.out.println("(Q) Exit the loop. ");
method = input.nextLine();
if (method.charAt(0) == 'f' || method.charAt(0) == 'F') {
System.out.println("Method F");
System.out.println("Enter the temperature in Fahrenheit: ");
F = input.nextDouble();
C = 5 * (F - 32) / 9;
System.out.println("Temperature in Celsius: " + C); }
if (method.charAt(0) == 'c' || method.charAt(0) == 'C') {
System.out.println("Method C");
System.out.println("Enter the temperature in Celsius: ");
C = input.nextDouble();
F = (9 * C / 5) + 32;
System.out.println("Temperature in Fahrenheit: " + F); }
if (method.charAt(0)== 'q' || method.charAt(0)== 'Q') {
keepGoing = false;
System.out.println("Exiting the loop! "); }
else {
//if index 0 doesn't equal to C, F, Q, it's out of range.
System.out.println("Method is out of range! ");
}
}while(keepGoing = true);
input.close();
}
}
循环将一直持续到我输入Q或q退出。因此我必须输入Q才能退出循环,但是在获得转换值后我得到了一条错误消息,它只是没有通过循环运行。该程序只是不通过while循环。
尝试2,仍有错误
package Lab_4;
import java.util.Scanner;
public class Lab_4 {
public static void main(String arg[]) {
Scanner input = new Scanner(System.in);
double F; //Fahrenheit
double C; //Celsius
String method;
boolean keepGoing = true;
do {
System.out.println("Choose a method: ");
System.out.println("(F) Fahrenheit to Celsius. ");
System.out.println("(C) Celsius to Fahrenheit. ");
System.out.println("(Q) Exit the loop. ");
method = input.nextLine();
if (method.charAt(0) == 'f' || method.charAt(0) == 'F') {
System.out.println("Method F");
System.out.println("Enter the temperature in Fahrenheit: ");
F = input.nextDouble();
C = 5 * (F - 32) / 9;
System.out.println("Temperature in Celsius: " + C); }
else if (method.charAt(0) == 'c' || method.charAt(0) == 'C') {
System.out.println("Method C");
System.out.println("Enter the temperature in Celsius: ");
C = input.nextDouble();
F = (9 * C / 5) + 32;
System.out.println("Temperature in Fahrenheit: " + F); }
else if (method.charAt(0)== 'q' || method.charAt(0)== 'Q') {
keepGoing = false;
System.out.println("Exiting the loop! "); }
else {
//if index 0 doesn't equal to C, F, Q, it's out of range.
System.out.println("Method is out of range! ");
}
}while(keepGoing);
input.close();
}
}
答案 0 :(得分:5)
你有一个错字:
}while(keepGoing = true);
应该是:
}while(keepGoing == true);
或只是:
}while(keepGoing);
keepGoing = true
,即使在某个条件中,也会将keepGoing
分配给true
并返回其值(在这种情况下始终为true
)。
另一方面,keepGoing == true
要求keepGoing
和true
之间的值相等。
答案 1 :(得分:2)
你的while循环在每次迭代后将keepGoing指定为true。这意味着你的循环将永远持续下去。由于您没有break
任何条件,我假设您不想要这种行为。
您的if语句会导致错误,因为它们不依赖于彼此。你现在有这样写的(简化):
if (method.charAt(0) == 'some_letter')
// do something
if (method.charAt(0) == 'some_other_letter')
// do something else
else
// show error
问题是第一个if条件是独立于第二个而检查的。这意味着,如果您的第一个条件(method.charAt(0) == 'some_letter'
)为真,那么您仍会收到错误消息,因为"否则"与第二个if语句绑定,这将是假的(因为第一个字符不能是两个不同的字符)。
写这个的正确方法是这样的(再次,简化):
if (method.charAt(0) == 'some_letter')
// do something
else if (method.charAt(0) == 'some_other_letter') // NOTE the else on this line
// do something else
else
// show error
这样做可以将所有条件联系在一起,因此只执行其中一个条件。
至于您收到的实际错误消息:发生这种情况是因为method
是一个空字符串。空字符串的长度为0,因此使0成为无效索引,因此method.charAt(0)
将导致StringIndexOutOfBounds错误。
但是为什么method
在运行第一个循环后是空白的?嗯,这有点像"陷阱"对于初学者。 Scanner.nextLine()
将检索当前行的其余部分。就扫描仪而言,一线"就是直到下一个换行符(你按下输入时得到的隐藏字符...... \n
)。另一方面,Scanner.nextDouble()
只抓取下一个数字......但不消耗换行符。
您的程序中发生的事情是,一旦您提示用户转换某些值,它就会添加一个不会被消耗的额外换行符。让我们逐步完成一个简单的例子:
do {
System.out.println("Choose your method")
method = Scanner.nextLine();
// User enters "f", then presses enter. This means the Scanner's buffer
// contains "f\n". nextLine will read everything up to "\n" (which is everything)
// then consumes the newline character. Afterwards, the Scanner's buffer
// is completely empty.
if ((method.charAt(0) == 'f') || (method.charAt(0) == 'F'))
{
double F = Scanner.nextDouble();
// User enters "12", then presses enter. The Scanner's buffer now contains
// "12\n". nextDouble will read in "12", but will NOT consume the
// newline character. Afterwards, the Scanner's buffer will contain "\n".
}
// Loop ends here. You start from the top and call Scanner.nextLine.
// However, the Scanner's buffer still has "\n" at this point, so
// nextLine will grab everything up to the newline (in other words, a blank string)
// and then consume the already existing newline. Since you do no error
// checking to make sure method has length > 0, your program crashes.
}
那你怎么解决这个问题呢?它实际上非常简单。致电Scanner.nextDouble()
后,只需致电Scanner.nextLine()
即可使用换行符。
此外,我建议添加一项检查以确保用户的输入有效(即,不是空字符串)。这样,您的程序不会崩溃。
有关更多信息和/或更好的解释,请参阅以下问题:Skipping nextLine() after using next(), nextInt() or other nextFoo() methods
答案 2 :(得分:1)
keepGoing = true
是Java中的赋值,而不是布尔条件,更改为
keepGoing == true
或简单while(keepGoing )
答案 3 :(得分:0)
indexOutOfBoundsException是你的案例“method”
中的空字符串method.charAt(0)
要避免这种情况,您可以在从控制台
获取输入后立即放置method = input.nextLine();
然后在下面添加if语句
if(!method.equals(""))
或检查字符串的长度
if(method.length() > 0)
// your code goes here
此外,while语句将值“true”赋值为boolean“keepgoing”,而不应该是
while(keepgoing)