簡體   English   中英

While循環僅執行一次

[英]While loop executes only once

我很難弄清楚為什么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();放入一行代碼inp.nextLine(); 在調用nextDouble()


示例和完整說明:

假設您輸入“ 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情況,因此退出循環。

如果兩個條件之一:

(convert.equalsIgnoreCase("km"))

要么

(convert.equalsIgnoreCase("m"))

...不是true ,請將boolean continue1設置為false ,這將在下一次迭代時中斷循環。

另請注意,由於它是布爾值,因此您可以(並且應該)這樣編寫while語句:

while (continue1) {
  // etc.
}

另請注意,在掃描特定類型(例如Scanner.nextDouble ,應嘗試/捕獲Exception ,因為如果輸入為意外類型,這很可能會破壞帶有堆棧跟蹤的代碼。

在您的代碼中,在while循環中初始化掃描器對象時仍然存在一個問題,它將解決打印兩次行的問題。 用這個

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;
        }

    }
}
}

請檢查這是您在評論中寫的問題的答案

采用

String convert = inp.next();

代替

String convert = inp.nextLine();

由於System.out.println(),nextLine()正在讀取空行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM