Java 扫描仪不在空格字符后读取

Java 扫描仪不在空格字符后读取,java,Java,我有2个来自用户的输入。一个是说问候语,另一个是告诉我你的名字 但是,当我在某件事之后写hello时,ex:hello,伙计扫描仪不读取第二个输入,它是mate,并从第一个字符串获取hello,第二个也是相同的 有什么建议吗 谢谢 public static void main(String[] args) { System.out.println("Choose what would you like to say ?"); String str1 = "";

我有2个来自用户的输入。一个是说
问候语
,另一个是
告诉我你的名字

但是,当我在某件事之后写hello时,
ex:hello,伙计扫描仪不读取第二个输入,它是
mate
,并从第一个字符串获取
hello
,第二个也是相同的

有什么建议吗

谢谢

public static void main(String[] args) {
        System.out.println("Choose what would you like to say ?");

        String str1 = "";
        String str2 = "";

        System.out.println("Say any greetings word");
        str1 = input();
        System.out.println("Tell me your name");
        str2 = input();

        if (str2.equalsIgnoreCase("zia")) {
            System.out.println("Hello Mr Zia, What a nice suprise");

        }

        else {
            System.out.println(str1 + " " + str2);
        }

    }

    public static String input() {
        Scanner sc = new Scanner(System.in);
        return sc.next();
    }

首先,您需要
sc.nextLine()
来读取整个输入

第二,你不应该每次都创建一个新的扫描仪。只需像这样重复使用扫描仪:

Scanner sc = new Scanner(System.in);
System.out.println("Say any greetings word");
str1 = sc.nextLine();
System.out.println("Tell me your name");
str2 = sc.nextLine();
如果不再需要,请关闭扫描仪:

sc.close();

这样,您甚至不再需要
input()
-方法。

首先,您需要
sc.nextLine()
来读取整个输入

第二,你不应该每次都创建一个新的扫描仪。只需像这样重复使用扫描仪:

Scanner sc = new Scanner(System.in);
System.out.println("Say any greetings word");
str1 = sc.nextLine();
System.out.println("Tell me your name");
str2 = sc.nextLine();
如果不再需要,请关闭扫描仪:

sc.close();

这样,您甚至不再需要
input()
-方法。

您不能在同一输入流上构建多个扫描仪。它们会相互冲突,导致您观察到的不一致

如图所示,对方法input()的每次调用都将在唯一的System.in上构建一个新的扫描仪。这是同一输入流上的多个扫描仪。不行

取而代之的是,在程序开始时一次性构建一个扫描仪,并在每次需要读取输入时使用该唯一的扫描仪

像这样:

  public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);

    System.out.println("Choose what would you like to say ?");

    System.out.println("Say any greetings word");
    String greeting = scanner.next();
    System.out.println("Tell me your name");
    String name = scanner.next();

    if (name.equalsIgnoreCase("zia")) {
      System.out.println("Hello Mr Zia, What a nice suprise");
    } else {
      System.out.println(greeting + " " + name);
    }
  }

不能在同一输入流上构建多个扫描仪。它们会相互冲突,导致您观察到的不一致

如图所示,对方法input()的每次调用都将在唯一的System.in上构建一个新的扫描仪。这是同一输入流上的多个扫描仪。不行

取而代之的是,在程序开始时一次性构建一个扫描仪,并在每次需要读取输入时使用该唯一的扫描仪

像这样:

  public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);

    System.out.println("Choose what would you like to say ?");

    System.out.println("Say any greetings word");
    String greeting = scanner.next();
    System.out.println("Tell me your name");
    String name = scanner.next();

    if (name.equalsIgnoreCase("zia")) {
      System.out.println("Hello Mr Zia, What a nice suprise");
    } else {
      System.out.println(greeting + " " + name);
    }
  }

你想要的是nextLine()而不是next(),为什么每次方法调用都要创建一个新的扫描程序?不要那样做。创建一个并重用它。请注意,
next()
只读取下一个标记(分隔符为空格)。您需要读取完整行的
nextLine()
(分隔符为换行符)。在提出此类问题之前,请务必阅读方法文档。文档详细解释了该方法,并给出了示例。请参阅。您想要的是nextLine()而不是next()。为什么要在每次方法调用时创建一个新的扫描程序?不要那样做。创建一个并重用它。请注意,
next()
只读取下一个标记(分隔符为空格)。您需要读取完整行的
nextLine()
(分隔符为换行符)。在提出此类问题之前,请务必阅读方法文档。文档详细解释了该方法,并给出了示例。请参阅。从技术上讲,您几乎不应该调用close()方法,而是让try with resource处理资源的关闭。此外,由于扫描仪是基于System.in构建的,而System.in不是由程序员打开的,而是由平台打开的,因此关闭它是一项值得怀疑的责任。为什么每个人都坚持使用nextLine()?问题很清楚,输入的两部分在同一行。next()是正确的调用。@kumesana查看文档:“查找并返回来自此扫描仪的下一个完整标记。”标记由空格字符分隔。除非另有规定,空格是分隔符。输入是Hello mate!!它是“Hello”,后面跟一个分隔符,后面跟“mate!!”。OP正在按原样使用next()expected@kumesana是的,空格是分隔符。但问题恰恰是扫描仪只读取这个分隔符!我假设OP想要读取整个输入,而不仅仅是第一个单词。从技术上讲,您几乎不应该调用close()方法,而是让try with resource来处理资源的关闭。此外,由于扫描仪是基于System.in构建的,而System.in不是由程序员打开的,而是由平台打开的,因此关闭它是一项值得怀疑的责任。为什么每个人都坚持使用nextLine()?问题很清楚,输入的两部分在同一行。next()是正确的调用。@kumesana查看文档:“查找并返回来自此扫描仪的下一个完整标记。”标记由空格字符分隔。除非另有规定,空格是分隔符。输入是Hello mate!!它是“Hello”,后面跟一个分隔符,后面跟“mate!!”。OP正在按原样使用next()expected@kumesana是的,空格是分隔符。但问题恰恰是扫描仪只读取这个分隔符!我假设OP想要读取整个输入,而不仅仅是第一个单词。