Java 而循环只执行一次

Java 而循环只执行一次,java,while-loop,Java,While Loop,我很难弄明白为什么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) {

我很难弄明白为什么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;
            }

        }
    }
}

我正在尝试使它循环,以便用户能够多次转换单位。欢迎任何帮助

问题是,当您调用
nextDouble()
时,它会使用号码,但不会使用号码后面的换行符。要解决这个问题,只需放置一行代码
inp.nextLine()nextDouble()
后的code>


示例和完整解释:

假设输入“km”,按回车键,“123”,按回车键。然后从程序的角度来看,输入流是
“km\n123\n”

代码
String convert=inp.nextLine()
获取值
“km”
,并将输入向前推进超过第一个
“\n”

代码
double num=inp.nextDouble()
获取字符串
“123”
,并返回值(双精度)123.0。当它看到
'\n'
时,它停止解析,但它不使用该字符-它保留在输入缓冲区中


在循环的下一次迭代中,
inp.nextLine()
立即看到
“\n”
,因此
字符串convert=”“。这将触发循环中的
else
大小写,因此它将退出循环。

问题是,当您调用
nextDouble()
时,它将使用数字,但不会使用数字后面的换行符。要解决这个问题,只需放置一行代码
inp.nextLine()nextDouble()
后的code>


示例和完整解释:

假设输入“km”,按回车键,“123”,按回车键。然后从程序的角度来看,输入流是
“km\n123\n”

代码
String convert=inp.nextLine()
获取值
“km”
,并将输入向前推进超过第一个
“\n”

代码
double num=inp.nextDouble()
获取字符串
“123”
,并返回值(双精度)123.0。当它看到
'\n'
时,它停止解析,但它不使用该字符-它保留在输入缓冲区中


在循环的下一次迭代中,
inp.nextLine()
立即看到
“\n”
,因此
字符串convert=”“。这将触发循环中的
else
案例,因此它将退出循环。

如果出现以下两种情况之一:

(convert.equalsIgnoreCase("km"))

。。。如果不是
true
,则将
布尔值设置为
continue1
false
,这将在下一次迭代时中断循环

还请注意,由于它是布尔值,因此您可以(也应该)编写
while
语句:

while (continue1) {
  // etc.
}

还请注意,在扫描特定类型时,您应该尝试/捕获
异常
s,例如
Scanner.nextDouble
,因为如果输入是意外类型,这很可能会使用堆栈跟踪中断代码

如果两种情况之一:

(convert.equalsIgnoreCase("km"))

。。。如果不是
true
,则将
布尔值设置为
continue1
false
,这将在下一次迭代时中断循环

还请注意,由于它是布尔值,因此您可以(也应该)编写
while
语句:

while (continue1) {
  // etc.
}
还请注意,在扫描特定类型时,您应该尝试/捕获
异常
s,例如
Scanner.nextDouble
,因为如果输入是意外类型,这很可能会使用堆栈跟踪中断代码

使用

String convert = inp.next();
而不是

String convert = inp.nextLine();
由于System.out.println()的原因,nextLine()正在读取空行。

使用

String convert = inp.next();
而不是

String convert = inp.nextLine();

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

代码中仍然存在一个问题初始化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;
        }

    }
}
}
请检查一下
这是您在注释中所写问题的答案。

代码中仍然存在一个问题。在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;
        }

    }
}
}
请检查一下
这是你问题的答案,写在评论中

我不明白如何处理最后一个问题{continue1=false}。。。因为如果它不是m或km,我希望它关闭。没关系。我明白了。现在我有另一个问题,这在我制作的任何程序中都经常发生。一旦它通过循环一次,行SYSTEM.out.println(“您想转换m-km还是km-m(km表示m-km,m表示km-m)”);然后在第二次跑步时打印两次,每次跑步后打印两次。是什么让它在第一个循环后每次打印两次?它不应该用那个代码在每个循环中打印两次。。。当然,一旦循环迭代,它将重新打印(一次)。我不知道如何处理最后一个else{continue1=false}。。。因为如果它不是m或km,我希望它关闭。没关系。我明白了。现在我有另一个问题,这在我制作的任何程序中都经常发生。一旦它通过循环一次,行SYSTEM.out.println(“您想转换m-km还是km-m(km表示m-km,m表示km-m)”);然后在第二次跑步时打印两次,每次跑步后打印两次。是什么让它在第一个循环后每次打印两次?它不应该用那个代码在每个循环中打印两次。。。当然,一旦循环迭代,它将重新打印(一次)。