Java,Do-While循环问题的新手

时间:2015-10-06 21:19:58

标签: java loops while-loop boolean

我对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循环。

enter image description here

尝试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();
        }
    }

4 个答案:

答案 0 :(得分:5)

你有一个错字:

}while(keepGoing = true);

应该是:

}while(keepGoing == true);

或只是:

}while(keepGoing);

解释

keepGoing = true,即使在某个条件中,也会将keepGoing分配给true并返回其值(在这种情况下始终为true)。

另一方面,keepGoing == true要求keepGoingtrue之间的值相等。

答案 1 :(得分:2)

代码逻辑错误

While Loop

你的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)