为啥在使用带有 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()
,它就不起作用。怎么会这样? next
和 nextLine
不是一样的东西,只是一个跳过一行,一个不跳过?
这是我的代码:
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?的主要内容,如果未能解决你的问题,请参考以下文章
JAVAScanner.next()与Scanner.nextLine()的区别