Scanner.next()可以返回null或空字符串吗?

时间:2017-12-25 19:45:29

标签: java input

我正在学习Java来自其他编程语言(Js,C和其他......)

我想知道在任何情况下Scanner.next()方法是否都可以返回(不抛出)无效字符串或少于一个字符(即。null或空字符串"" )。我过去常常仔细检查用户输入是否存在任何可能的意外/无效值,但我想知道对nullmyString.length() < 1的测试是否始终是不必要的,或者是否有用/需要。< / p>

我特别要求从命令行和System.in读取,而不是从其他文件流中读取。从终端输入正常读取时,是否可以安全地从返回值中获取myString.charAt(0)的第一个字符(即没有管道,没有文件,直接从终端和键盘)?

我搜索了Java SE 9 API文档,但无法找到有关可能意外返回值的提及。如果输入出现任何问题,它应该抛出异常,对吗?

示例(没有导入的主要方法的一部分):

Scanner keyboard = new Scanner(System.in);

System.out.print("Enter a selection (from A to E): ");
String res = keyboard.next();

if (res == null || res.length() < 1) {
    // Unnecessary if?
}

3 个答案:

答案 0 :(得分:3)

Scanner#next 永远不会返回null,如果用户输入空字符串或仅包含空格的字符串,则该方法将阻止并等待输入进行扫描。

因此if条件是多余的,根本不需要。

答案 1 :(得分:2)

Scanner.next永远不会通过查看其源代码返回null。来自Scanner.next代码

while(true){ 
...
if (token != null) {
      matchValid = true;
      skipped = false;
      return token;
 }
 ...
}

如果没有可用的令牌,则可以抛出NoSuchElementException;如果根据文档关闭扫描仪,则可以IllegalStateException。所以你的支票是多余的。

答案 2 :(得分:0)

给定以下输入:

    a b c
    d e
    f
    g

下面的细分显示了对 Scanner 对象的特定调用序列如何读取上述输入:

调用 scan.next();返回下一个标记 a.
调用 scan.next();返回下一个标记 b.
调用 scan.nextLine();返回下一个标记,c。需要注意的是,扫描器会返回一个空格和一个字母,因为它会从最后一个标记的末尾读取到下一行的开头。
调用 scan.nextLine();返回下一行的内容,d e。 调用 scan.next();返回下一个标记 f.
调用 scan.nextLine();返回 f 之后直到下一行开始的所有内容;因为那里没有字符,所以它返回一个空字符串。 调用 scan.nextLine();返回 g.