如何检测 java 扫描仪中的空行

How to detect an empty line in java scanner

我搜索了很多,但没有找到可以解决这个问题的方法。我正在使用 nextInt 来读取用户的输入,但如果用户没有输入任何内容(只需按回车键),它将无限循环直到用户输入内容。但我想要的是在用户什么都不输入时停止程序,并告诉他们“这是空的”。我应该怎么办?有人可以帮我吗? 提前致谢。

import java.util.Scanner;

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

        Scanner scan = new Scanner(System.in);

        if (scan.hasNextInt()){

            int num1 = scan.nextInt();
            int num2 = scan.nextInt();

            int Difference = Math.abs(num2 - num1);

            if (num1 == num2) {
                System.out.println("They are equal");
            }else if (num1 < 0 | num2 < 0){
                System.out.println("No negative number!");
            }else{
                System.out.println("Their difference is " + Difference);
            }
        }else{
            System.out.println("Wrong! Please enter correct number");
        }
    }
}

scanner.hasNext() 永远为真,循环不会结束,因为总是有一个字符串输入,即使它是空的 "".

你可以使用这个语句:if(line.length() == 0) break;

这段代码检查用户是否按下了 <Enter>。如果他们这样做了,那么我们打印出 "User pressed enter"。 如果他们按了其他东西,那么我们会尝试将该行解析为整数。

import java.util.Scanner;

public class Play {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        // The sc.nextLine() call will retrieve 
        // the line that the user entered.
        String lineEnteredByUser = sc.nextLine();

        // If the user presses an empty line 
        // the lineEnteredByUser variable will contain 
        // the empty String "".
        if ("".equals(lineEnteredByUser)) {
            System.out.println("User pressed enter");

        } else {            
            // If the user entered something else then
            // we try to parse it as an `int` using
            // `Integer.parseInt`. A NumberFormatException
            // might occur if the use did not input an int.   
            int result = Integer.parseInt(lineEnteredByUser); 
            System.out.println("User pressed " + result);
        }
    }
}

如果我们 运行 上面的 java 代码(我将其放在一个名为 Play.java 的文件中),我们将得到以下内容:

$ java Play.java
1
User pressed 1

$ java Play.java

User pressed enter

$ java Play.java
1.2
Exception in thread "main" java.lang.NumberFormatException: For input string: "1.2"

您可以在此处找到我使用的函数的文档:parseInt, nextLine

I'm using nextInt to read the input from the user, but if the user enters nothing (just presses enter), it will loop infinitely until the user enters something.

这是真的,假设 Scanner 从标准输入读取。 (nextInt 调用将继续读取,直到它获得非空白字符。)

因此,如果您想为用户提供输入 ENTER 停止的选项,则不应直接在 Scanner 上调用 nextInt()。相反,您可以调用 nextLine() 从用户那里获得完整的输入行。然后尝试将该行解析为整数;例如使用 new Scanner(theLine).nextInt().

对此有许多可能的变体。


如果您的目标(字面上)只是测试空行,则调用 Scanner.nextLine() 并测试结果是否为空字符串。但是,您需要考虑在调用 nextLine() 之前 扫描仪 发生的情况。例如,如果你做的最后一件事是(成功地)调用 nextInt(),那么在当前行的数字 ... 之后仍然会有字符。在阅读下一行之前,您需要“使用”这些字符(通过额外的 nextLine() 调用)。

Scanner scanner = new Scanner(System.in);
String nextLine = scanner.nextLine() ;

您可以检查 nextLine.equals("") 是否为空字符串。

您可以使用 scan.nextLine() 获取输入,然后检查用户是否在单行中输入了正确的模式。您可以提示用户在由 space:

分隔的单行中提供输入
System.out.println("Please enter two numbers in a single line separated by a space. (i. e.: 4 12)");

您可以检查模式并通过拆分和解析完成您的工作,如下所示:

if (Pattern.matches("\d+ \d+", input)) {
        String[] nums = input.split(" ");
        int num1 = Integer.parseInt(nums[0]);
        int num2 = Integer.parseInt(nums[1]);
        ....
}

完整程序如下:

public static void main(String[] args) {

    Scanner scan = new Scanner(System.in);
    String input = scan.nextLine();
    if (Pattern.matches("\d+ \d+", input)) {
        String[] nums = input.split(" ");
        int num1 = Integer.parseInt(nums[0]);
        int num2 = Integer.parseInt(nums[1]);
        if (num1 == num2) {
            System.out.println("They are equal");
        } else if (num1 < 0 || num2 < 0) {
            System.out.println("No negative number!");
        } else {
            System.out.println("Their difference is " + Math.abs(num2 - num1));
        }
    } else {
        if (input.isEmpty()) {
            System.out.println("This is Empty");
        } else {
            System.out.println("Wrong! Please enter correct number");
        }
    }
}

更新

如果你想让你的程序同时支持单行输入和双行输入,你可以重构代码如下:

public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    System.out.println("Please enter two numbers in a single line separated by a space. (i. e.: 4 12)");
    String input = scan.nextLine().trim();
    if (input.matches("\d+ \d+")) {
        doParsingAndCalculation(input);
    } else {
        if (input.isEmpty()) {
            System.out.println("This is Empty");
        } else if (input.matches("\d+")) {
            String secondLine = scan.nextLine().trim();
            StringBuilder stringBuilder = new StringBuilder(input);
            if(secondLine.matches("\d+")) {
                stringBuilder.append(" ").append(secondLine);
                doParsingAndCalculation(stringBuilder.toString());
            } else {
                System.out.println("Wrong! Please enter correct number");
            }
        }
        else {
            System.out.println("Wrong! Please enter correct number");
        }
    }
}

private static void doParsingAndCalculation(String input) {
    String[] nums = input.split(" ");
    int num1 = Integer.parseInt(nums[0]);
    int num2 = Integer.parseInt(nums[1]);
    if (num1 == num2) {
        System.out.println("They are equal");
    } else if (num1 < 0 || num2 < 0) {
        System.out.println("No negative number!");
    } else {
        System.out.println("Their difference is " + Math.abs(num2 - num1));
    }
}