有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

为什么我不能在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();

共 (4) 个答案

  1. # 1 楼答案

    这里:

    String string1 = scan.nextLine().nextLine();
    

    让我们分手吧:

    String string1 = scan.nextLine()
    

    在扫描仪上调用nextLine()。它返回一个字符串

    因此,您的代码可以归结为

    String string1 = someOtherString.nextLine(); 
    

    当然,这是行不通的。因为String类不知道下一行,所以没有这样的方法

    记住:扫描仪返回一个字符串,这是两个非常不同的对象

    如果你从盒子里拿出一个鸡蛋,为什么你会期望你能从你得到的鸡蛋里拿出另一个鸡蛋?!你可以从同一个盒子里取出两个鸡蛋,但不能从鸡蛋里取出一个鸡蛋

    最后:是的,有“流畅”API的想法,它允许以“这样”的方式链接方法调用。但是只能适用于明确为此而设计的场景

  2. # 2 楼答案

    参考:Why is nextLine() returning an empty string?

    scannerObj.nextInt()不读取以下新行字符,因此第一个下一行(返回当前行的其余部分)will always return an empty string.

    这应该是有效的:

    int count = readInput.nextInt();
    readInput.nextLine();
    
    String input=readInput.nextLine();
    
  3. # 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. # 4 楼答案

    看看Scanner#nextLine()的返回类型。它返回一个String,而不是一个Scanner

    你写的相当于:

    String string1 = scan.nextLine();
    String string2 = string1.nextLine();
    

    方法链用于根据每个方法的返回类型从一个对象跳到下一个对象,使代码更加紧凑,并减少声明的数量