Java BufferedReader.readLine() 跳过了一行

Java BufferedReader.readLine() Skipped One Line

我正在尝试制作一些分布式 java RMI 程序,当我需要从用户那里获取输入时遇到了问题。在下面的代码片段中,输入 1 似乎不错,但是第一次输入 2 没有打印任何东西,当我再次输入 2 时,它起作用了。

这是怎么发生的?检查了 BufferedReader.readLine() 函数文档,但没有发现任何与此相关的内容。这跟else if有关系吗?

import java.io.*;
public class test {

    private static BufferedReader lineOfText = new BufferedReader(new InputStreamReader(System.in));

    public test() throws NumberFormatException, IOException {
        System.out.println("1 to create an auction, 2 to close an auction");
        if (Integer.parseInt(lineOfText.readLine()) == 1) {
            System.out.println("1 recieved");
        } else if (Integer.parseInt(lineOfText.readLine()) == 2) {
            System.out.println("2 recieved");
        } else {
            return;
        }
    }
    public static void main(String[] args) throws NumberFormatException, IOException {
        test t = new test();
    }
}

输入1:

1 to create an auction, 2 to close an auction
1 //<- that's the input
1 recieved

输入2:

1 to create an auction, 2 to close an auction
2 //<- that's the input yet nothing happened
2 //<- input again
2 recieved

还在一些在线编译器上尝试了代码片段,结果与我的相同VSCode。这可能是一个简单的问题,但我不知道发生了什么;\

因为您在“if”和“else-if”中都调用了“readline()”,所以它会在每次尝试检查条件时调用 readline() 两次:一次当它 运行 是“if”条件,然后是 运行 else-if 时的第二次。当您在条件语句中放置一个函数时,例如:

if(myFunction() == true){}

在将其 return 值与条件进行比较之前,它将始终 运行 该函数。所以当你有:

if (Integer.parseInt(lineOfText.readLine()) == 1) {
        System.out.println("1 recieved");
    } else if (Integer.parseInt(lineOfText.readLine()) == 2) {
        System.out.println("2 recieved");
    } else {
        return;
    }

它会在检查“if”和“else-if”时再次调用 readLine()。

您应该在开始根据条件检查它之前调用 readline 以确保它只有 运行 一次:

import java.io.*;
public class test {

private static BufferedReader lineOfText = new BufferedReader(new InputStreamReader(System.in));

public test() throws NumberFormatException, IOException {
    
    System.out.println("1 to create an auction, 2 to close an auction");
    String myLine = lineOfText.readLine(); //call readLine() before checking conditions so it only runs once
    if (Integer.parseInt(myLine) == 1) {
        System.out.println("1 recieved");
    } else if (Integer.parseInt(myLine) == 2) {
        System.out.println("2 recieved");
    } else {
        return;
    }
}
public static void main(String[] args) throws NumberFormatException, IOException {
    test t = new test();
}

}

当你输入 2 时,第一个 if 语句读取的数字当然不等于 1,那么下一个 if 语句将不会为你提供最后一个输入 2

您需要将 readLine() 放在 if 之外,使其只读一次。

public class test {

    private static BufferedReader lineOfText = new BufferedReader(new InputStreamReader(System.in));

    public test() throws NumberFormatException, IOException {
        System.out.println("1 to create an auction, 2 to close an auction");
        
        int choice = Integer.parseInt(lineOfText.readLine());
        
        if (choice == 1) {
            System.out.println("1 recieved");
        } else if (choice == 2) {
            System.out.println("2 recieved");
        } else {
            return;
        }
    }
    public static void main(String[] args) throws NumberFormatException, IOException {
        test t = new test();
    }
}