【问题标题】:While loop executes only onceWhile 循环只执行一次
【发布时间】:2013-08-12 09:05:50
【问题描述】:

我很难弄清楚为什么 while 循环实际上不会循环。它运行一次就停止了。

import java.util.*;

public class mileskm {
    public static void main(String[] args) {

        Scanner inp = new Scanner(System.in);
        boolean continue1 = true;

        while (continue1 == true) {

            System.out.println("Would you like to convert m-km or km-m(km for m-km and m for km-m)");

            String convert = inp.nextLine();
            if (convert.equalsIgnoreCase("km")) {
                System.out.println("Enter the mileage to be converted.");
                double num = inp.nextDouble();
                double con = num * 1.60934;
                System.out.println(con);
                continue1 = true;
            } else if (convert.equalsIgnoreCase("m")) {
                System.out.println("Enter the km to be converted.");
                double num = inp.nextDouble();
                double con = num * 0.621371;
                System.out.println(con);
                continue1 = true;
            } else {
                continue1 = false;
            }

        }
    }
}

我试图让它循环,以便用户能够多次转换单位。欢迎任何和所有帮助!

【问题讨论】:

    标签: java while-loop


    【解决方案1】:

    在您的代码中仍有一个问题在您的 while 循环中初始化您的扫描仪对象,它将解决您打印该行 2 次的问题。使用这个

    import java.util.*;
    
    public class mileskm {
    public static void main(String[] args) {
    
        Scanner inp;
        boolean continue1 = true;
    
        while (continue1) {
    
            System.out.println("Would you like to convert m-km or km-m(km for m-km and m for km-m)");
           inp = new Scanner(System.in);
    
            String convert = inp.nextLine();
            if (convert.equalsIgnoreCase("km")) {
                System.out.println("Enter the mileage to be converted.");
                double num = inp.nextDouble();
                double con = num * 1.60934;
                System.out.println(con);
                continue1 = true;
            } else if (convert.equalsIgnoreCase("m")) {
                System.out.println("Enter the km to be converted.");
                double num = inp.nextDouble();
                double con = num * 0.621371;
                System.out.println(con);
                continue1 = true;
            } else {
                break;
            }
    
        }
    }
    }
    

    请检查一下 这是用cmets写的你的问题的答案

    【讨论】:

      【解决方案2】:

      使用

      String convert = inp.next();
      

      而不是

      String convert = inp.nextLine();
      

      nextLine() 由于 System.out.println() 正在读取空行。

      【讨论】:

        【解决方案3】:

        问题在于,当您调用nextDouble() 时,它会使用该号码,但不会使用该号码之后的换行符。要解决这个问题,只需在调用nextDouble() 之后添加一行代码inp.nextLine();


        示例和完整说明:

        假设您输入“km”,按回车,“123”,按回车。那么从程序来看,输入流是"km\n123\n"

        代码String convert = inp.nextLine(); 获取值"km",并将输入推进到第一个"\n" 之后。

        代码 double num = inp.nextDouble(); 获取字符串 "123" 并返回值 (double)123.0 。当它看到'\n' 时它会停止解析,但它不会消耗该字符 - 它仍保留在输入缓冲区中。

        在循环的下一次迭代中,inp.nextLine(); 立即看到"\n",所以String convert = "";。这会触发循环中的 else 情况,因此它会退出循环。

        【讨论】:

          【解决方案4】:

          如果两个条件之一:

          (convert.equalsIgnoreCase("km"))
          

          (convert.equalsIgnoreCase("m"))
          

          ... 不是true,您将boolean continue1 设置为false,这将在下一次迭代中中断您的循环。

          还请注意,由于它是一个布尔值,您可以(并且应该)这样编写您的 while 语句:

          while (continue1) {
            // etc.
          }
          

          另请注意,当您扫描特定类型时,您应该尝试/捕获Exceptions,例如Scanner.nextDouble,因为如果输入是意外类型,这很可能会通过堆栈跟踪破坏您的代码。

          【讨论】:

          • 我不明白如何处理最后一个 else {continue1 = false}...因为如果它不是 m 或 km 我希望它关闭。
          • 没关系。我想通了。现在我有另一个问题,这在我制作的任何程序中都经常发生。一旦它通过循环一次,行 ystem.out.println("你想转换 m-km 还是 km-m(km 为 m-km 和 m 为 km-m)");然后在第二次运行时打印两次,之后每次运行。是什么让它在第一次循环后每次打印两次?
          • 它不应该使用该代码在每个循环中打印两次......当然,一旦循环迭代,它会重新打印(一次)。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-04-02
          • 1970-01-01
          • 1970-01-01
          • 2019-06-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多