【问题标题】:(Java) Program ignores Scanner at the point I want to enter a String(Java)程序在我想输入字符串时忽略扫描仪
【发布时间】:2015-12-12 16:19:23
【问题描述】:

我有以下3种方法:

  1. 方法:获取文本并将其单词拆分为特定的字符串并将它们放入字符串数组中。

    public static String[] generateStringArray(String text) {
        if (text.isEmpty()) {
            throw new IllegalArgumentException(MSG_STRING_EMPTY);
        }
    
        // split pattern for all non word characters
        return text.trim().split("\\W+");
    }
    
  2. 方法:计算数组中仅由大写或小写字母组成的字符串的数量。

    public static int countLowerUpperCaseStrings(String[] stringArray) {
        if (stringArray.length == 0) {
            throw new IllegalArgumentException(MSG_ARRAY_LENGTH_ZERO);
        }
    
        String convertedString;
        int counter = 0;
        char a;
        char b;
    
        for (int i = 0; i < stringArray.length; i++) {
            a = stringArray[i].charAt(0);
            b = stringArray[i].toLowerCase().charAt(0);
    
            if (a == b) {
                convertedString = stringArray[i].toLowerCase();
            } else {
                convertedString = stringArray[i].toUpperCase();
            }
    
            if (stringArray[i].compareTo(convertedString) == 0) {
                counter++;
            }
        }
        return counter;
    }
    
  3. Method:实际的方法,通过 Scanner 输入文本并调用其他方法。

    public void numberOfUpperLowerCaseStrings() {
        String text;
        String[] stringArray;
    
        System.out.println("Enter a text:");
        text = input.nextLine();
        stringArray = Algorithmen.generateStringArray(text);
    
        System.out.println(Algorithmen.countLowerUpperCaseStrings(stringArray));
    }
    

请注意,Algorithmen 是定义前两个(静态)方法的类的名称。

我测试了前两种方法,它们工作得很好。

现在问题来了,如果我调用第三种方法首先通过Scanner生成文本。

但不知何故,代码只是跳过了 text = input.nextLine(); 行并抛出异常(MSG)字符串为空。执行文本“输入一个文本:”,紧接着异常。但我无法输入任何文字。

如果我将input.nextLine(); 更改为 input.next(),我可以输入文本,但之后会陷入无限循环的异常。

那为什么我不能输入文字呢?

我还有另外两种方法,input.nextLine 工作得很好。

【问题讨论】:

  • 您可能之前调用了 input.nextInt() 或其他东西,并且错误地假设它在整数之后读取 EOL 字符。因此,对 nextLine() 的后续调用仅读取行尾,因此返回一个空字符串。删除所有不相关的代码,这些代码已经过测试并且可以找到。向我们展示定义和使用扫描仪的代码。
  • 你在哪里初始化input扫描仪?在此之前,您很可能正在阅读其他内容,例如整数。
  • 我在方法之外全局定义了 Scanner 作为静态变量。我刚刚为该方法定义了另一个 Scanner,现在它可以工作了。我是否正确地假设问题是,我以静态方式声明了 Scanner?我这样做是为了可以在静态方法中使用它。并且静态变量的值可用于任何使用该变量的方法。
  • 不,你错了。您是否阅读了我之前的评论以及副本的链接?这可能就是问题所在。

标签: java string java.util.scanner


【解决方案1】:

我能想到这种行为的唯一原因是您之前可能使用相同的 Scanner 对象来扫描整数(未在您的代码中显示)。

如果你这样做了,

  • 只需在input.nextInt() 之后放置一个input.nextLine() 即可清除缓冲区

  • 将您的 input.nextInt() 替换为 Integer.parseInt(input.nextLine())

【讨论】:

  • 备注: 我个人更喜欢后一种方式。试试看,让我知道结果。
  • 是的,这可能是问题所在。当我以静态方式定义 Scanner 变量时,所有其他方法共享此变量。当我刚刚为该方法定义了一个新的 Scanner 变量时,它开始正常工作。
  • 后一种方法与前一种方法不同。前者读取本地化整数,而不是后者。例如,在美国语言环境中,输入 123,456 对前者可以正常工作,但对后者则不行。
猜你喜欢
  • 2011-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多