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