为啥在使用带有 next() 和 nextLine() 的 Scanner 读取 2 个看似相同的字符串时得到 equals() == false?

Posted

技术标签:

【中文标题】为啥在使用带有 next() 和 nextLine() 的 Scanner 读取 2 个看似相同的字符串时得到 equals() == false?【英文标题】:Why do I get equals() == false when reading 2 seemingly identical Strings using a Scanner with next() and nextLine()?为什么在使用带有 next() 和 nextLine() 的 Scanner 读取 2 个看似相同的字符串时得到 equals() == false? 【发布时间】:2013-06-11 14:59:01 【问题描述】:

我正在制作一个基本的计算器。当我尝试比较字符串并使用next() 时,它工作正常,但是如果我使用nextLine(),它就不起作用。怎么会这样? nextnextLine 不是一样的东西,只是一个跳过一行,一个不跳过?

这是我的代码:

import java.util.Scanner;

class apples

    public static void main(String args[])

        Scanner Max = new Scanner(System.in);

        int num1, num2, answer;
        String plumi;

        System.out.println("enter your first number");
        num1 = Max.nextInt();
        System.out.println("enter your second number");
        num2 = Max.nextInt();
        System.out.println("enter if you want to use plus or minus");
        plumi = Max.next();
        if(plumi.equals("plus"))
            answer = num1 + num2;
            System.out.println("the answer is " + answer);
        
        if(plumi.equals("minus"))
            answer = num1 - num2;
            System.out.println("the answer is " + answer);
        

    

【问题讨论】:

您可以尝试调试它以查看您正在比较的字符串。 nextLine 从当前位置读取直到行尾 如果您没有使用库(例如,Apache commons lang)来提供空安全字符串比较,请将您的字符串比较反转为 "literal".equals(not_literal) 或在您的情况下为 "plus ".equals(plumi) 第一件事:Java 命名约定说变量和实例的第一个字母需要小写。 “它不起作用”是什么意思?发生什么事?至于next()nextLine(),第一个只上升到下一个空格,而nextLine 上升到\n 休息 请不要以大写开头的变量,这在 Java 中会造成混淆。只有类以大写开头。 【参考方案1】:

它们不一样。

next()nextInt() 方法首先跳过与分隔符模式匹配的任何输入,然后尝试返回下一个标记。 nextLine() 方法返回当前行的其余部分。

例如,如果输入是"123\nplus\n",则对nextInt() 的调用将消耗123,让\n 处于等待状态。

此时,对next() 的调用将跳过\n,然后使用plus,让最终的\n 等待。或者,对nextLine() 的调用将消耗\n 并返回一个空字符串作为行,而plus\n 则处于等待状态。

如果您希望在使用next()nextInt() 之后再使用nextLine(),答案是插入对nextLine() 的额外调用以刷新剩余的换行符。

【讨论】:

【参考方案2】:

试试这个代码而不是你的代码:

if(plumi.equals("plus"))
    answer = num1 + num2;
    System.out.println("the answer is " + answer);

else if(plumi.equals("minus"))
    answer = num1 - num2;
    System.out.println("the answer is " + answer);

else 
    System.out.println(plumi);

然后尝试以下输入:

1 //press enter
2 plus //press enter

看看会发生什么,你就会明白。

【讨论】:

【参考方案3】:

一个有效而另一个无效的原因是......好吧,它们不是一回事。它们都存在于稍微不同的用例中。

比较 next()nextLine() - nextLine() 期望行分隔符终止,我认为您的输入没有。但是,文档注释表明,即使没有终止行分隔符,它也应该可以工作,因此您必须进行调试才能准确找出它为您中断的原因。

【讨论】:

【参考方案4】:

乍一看,您的代码应该可以工作。要查看它为什么不起作用,您必须对其进行调试。如果您还不知道如何使用调试器,请使用“穷人的调试器”:

System.out.println("enter if you want to use plus or minus");
plumi = Max.next();
System.out.println("You entered ["+plumi+"]"); // poor man's debugger

我用[] 引用该值,因为它们很少是我要打印的值的一部分,并且它可以更容易地查看何时有额外的、意外的空格(如[ plumi][plumi ]

【讨论】:

不知道为什么这被否决了......公平地说,它会证明答案。结果将在其中某处有一条新线并提供一些见解。

以上是关于为啥在使用带有 next() 和 nextLine() 的 Scanner 读取 2 个看似相同的字符串时得到 equals() == false?的主要内容,如果未能解决你的问题,请参考以下文章

Java sanner类中next和nextLine的区别

JAVAScanner.next()与Scanner.nextLine()的区别

Scanner.next()与Scanner.nextLine()的区别

nextLine()方法和next()方法区别

Java中next() 与 nextLine() 区别

next()和nextLine()的区别和使用