为什么我不能在java中调用nextLine()方法两次?
在使用Java的nextInt()方法时,我遇到了以下代码:
Scanner scan = new Scanner(System.in);
int count = scan.nextInt();
String string1 = scan.nextLine();
我知道string1将包含一个空字符串。我的问题是,为什么像下面这样调用nextLine方法两次会出现错误:
String string1 = scan.nextLine().nextLine();
# 1 楼答案
这里:
让我们分手吧:
在扫描仪上调用
nextLine()
。它返回一个字符串因此,您的代码可以归结为
当然,这是行不通的。因为String类不知道下一行,所以没有这样的方法
记住:扫描仪返回一个字符串,这是两个非常不同的对象
如果你从盒子里拿出一个鸡蛋,为什么你会期望你能从你得到的鸡蛋里拿出另一个鸡蛋?!你可以从同一个盒子里取出两个鸡蛋,但不能从鸡蛋里取出一个鸡蛋
最后:是的,有“流畅”API的想法,它允许以“这样”的方式链接方法调用。但是只能适用于明确为此而设计的场景
# 2 楼答案
参考:Why is nextLine() returning an empty string?
scannerObj.nextInt()
不读取以下新行字符,因此第一个下一行(返回当前行的其余部分)will always return an empty string.
这应该是有效的:
# 3 楼答案
如何调试
我认为比一个简单的答案更重要的是关于如何调试它的一些信息
假设您使用的是IntelliJ或Eclipse之类的IDE,它们有丰富的功能(用谷歌搜索很容易)
对于IntelliJ,例如:
alt + enter
并告诉它创建局部变量。这将适用于正确的类型(即^{ctrl + b
跳转到函数调用中,并看到它清楚地返回String
李>Java文档
此外,你可以很容易地跳转到谷歌的Java doc for scanner
https://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#hasNextLine()
实际上,当您使用ctrl+b跳转到函数中时,Java文档通常在IDE中可用或可下载,即使使用浏览器也可以节省时间:)
基本答案
但无论如何,这里的问题只是第一个函数调用返回一个字符串,它不是扫描器,所以不能对它使用扫描器函数:)
# 4 楼答案
看看
Scanner#nextLine()
的返回类型。它返回一个String
,而不是一个Scanner
你写的相当于:
方法链用于根据每个方法的返回类型从一个对象跳到下一个对象,使代码更加紧凑,并减少声明的数量