【问题标题】:How to use a public static scanner in other methods? (nextLine()); [duplicate]如何在其他方法中使用公共静态扫描仪? (下一行()); [复制]
【发布时间】:2015-01-30 02:58:22
【问题描述】:
import java.util.Scanner;

public class mainClass{

    static public Scanner keyboard = new Scanner(System.in);

    public static void main (String [ ] args)
    {
        anotherMethod();
    }

    static public void anotherMethod()
    {
        String sentence;
        String answer;

        do{
            System.out.println("Lets read a sentence: ");
            String Sentence = keyboard.nextLine();
            System.out.println("The sentence read: " + sentence);

            System.out.println("Do you want to repeat?");
            answer = keyboard.next();

        } while (answer.equalsIgnoreCase("yes");
    }

}

结果是第一次运行后,程序显示"Lets read a sentence:""The sentence read: ",不让我输入一个句子..

我想知道解决这个问题的简单方法。

【问题讨论】:

  • 这不会编译...
  • 对不起。解决了问题。
  • 您输入的是“是的,您好,这是一个文本句子”,还是只是“yes”?后者是“是”后跟一个空行。
  • 请先正确格式化您的代码并修正您的拼写错误。 Java 区分大小写。您正在声明 两个 类型为 String 的变量,一个名为 sentence,一个名为 Sentence
  • 一个扫描器应该很少是一个数据成员,而不是静态或公共的。这没有意义。

标签: java methods static


【解决方案1】:

这是发生的事情:程序用nextLine 读取输入,然后提示输入是/否,此时您键入yes,然后按Enter。现在Scanner的缓冲区包含这四个字符:

'y' 'e' 's' '\n'

当您调用next() 时,Scanner 会读取最多用作分隔符的'\n' 的字符。字母从缓冲区中删除,因此"yes" 成为next() 的结果。但是,'\n'没有被占用!它留在缓冲区中,以供下一次Scanner 调用。

现在循环进入下一次迭代,您的程序提示输入更多输入,并调用nextLine()。还记得缓冲区中的'\n' 吗?这就是您的程序将立即读取的内容,结束输入。

您可以通过将next() 的调用替换为nextLine() 的调用来解决此问题。

【讨论】:

    【解决方案2】:

    您还需要使用nextLine() 方法来收集您的answer 字符串。

    answer = keyboard.nextLine();
    

    否则,next() 调用仅返回字符串 yes,但会留下一个悬空的新行字符,在您的 while 循环的下一次迭代中扫描该字符串,而不会让您有机会输入内容。

    【讨论】:

      猜你喜欢
      • 2016-06-01
      • 1970-01-01
      • 2019-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多