【发布时间】:2015-12-12 16:19:23
【问题描述】:
我有以下3种方法:
-
方法:获取文本并将其单词拆分为特定的字符串并将它们放入字符串数组中。
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+"); } -
方法:计算数组中仅由大写或小写字母组成的字符串的数量。
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; } -
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