我正在尝试Java编程书中的几个练习。我有以下代码:
import java.io.*;
import java.util.Scanner;
public class Ex420
{
public static void main( String args[] )
{
String employeeName = "";
double workHours,excessHours, hourlyRates, grossPay;
Scanner input = new Scanner( System.in );
while ( employeeName != "stop" )
{
System.out.printf( "\nInput employee name or stop to exit: " );
employeeName = input.nextLine();
System.out.printf( "Input working hours: " );
workHours = input.nextDouble();
System.out.printf( "Input hourly rates: " );
hourlyRates = input.nextDouble();
if ( workHours <= 40 & workHours >= 0 )
{
excessHours = 0;
grossPay = hourlyRates * workHours;
System.out.printf( "%s's gross pay is $%.2f\n", employeeName, grossPay );
}
else if ( workHours > 40 )
{
excessHours = workHours - 40;
grossPay = hourlyRates * 40 + 1.5 * hourlyRates * excessHours;
System.out.printf( "\n%s's worked for %.1f excess hours.\n", employeeName, excessHours );
System.out.printf( "%s's gross pay is $%.2f\n", employeeName, grossPay );
}
else
{
System.out.printf( "Invalid input. Please try again." );
}
} // end while
} // end main
} // end class Ex420
问题是,while循环似乎不起作用。每当我输入“stop”作为employeeName时,程序就会继续。我尝试用任何其他字符串替换“停止”,它仍然无法正常工作。但是当我尝试使用“stop”初始化employeeName时,程序会立即退出,这是预期的。我在这里做错了什么?
此外,在第一个循环之后,程序总是跳过询问employeeName。我尝试将employeeName = input.nextLine();
替换为employeeName = input.next();
,并且不再跳过它。我想知道,在使用employeeName = input.nextLine();
时,有什么方法可以让它不跳过输入?
提前感谢您的帮助!
答案 0 :(得分:13)
在比较Java中的字符串时,使用equals方法,而不是==或!=运算符。通过使用这些运算符,您只需比较对象的引用而不是它们的内容。所以你的情况应该是
while ( !"stop".equals(employeeName) )
请注意,“stop”是第一个,因为理论上您的employeeName变量可以为null。这样代码就不会通过在null对象上调用equals方法来抛出NullPointerException
。
答案 1 :(得分:7)
我猜这是因为你在!=
循环中使用的while
测试比较字符串以获得引用相等性。也就是说,当它进行比较时,它不只是测试以查看字符串是否具有相同的字符序列;它检查它们是否是完全相同的对象。但是当Scanner
创建String
以包含从标准输入中读取的文本时,String
将不会与您的字符串文字"stop"
中的对象相同码。它们是恰好具有相同内容的两个对象,但它们存在于内存中的不同位置,因此!=
将它们视为不相等。
解决方案:改为开始你的循环:
while (!"stop".equals(employeeName)) {
答案 2 :(得分:3)
问题是您没有使用正确的结构,而是需要使用equals()
而不是==
来比较String
。你想要的基本结构是:
System.out.printf("\nInput employee name or stop to exit: ");
String employeeName = input.nextLine();
while (!employeeName.equals("stop")) {
...
System.out.printf("\nInput employee name or stop to exit: ");
employeeName = input.nextLine();
}
基本上你需要检查用户是否立即进入“停止”并且上面是这样做的。你的版本没有。
另外,请尝试采用Java编码约定,包括间距和花括号放置。
答案 3 :(得分:0)
同上之前关于==与等于的海报。
当您将employeeName初始化为“stop”时,它会起作用,因为Java编译器会看到两个相同的字符串并重新使用该对象。那就是:
String employeeName =“stop”; if(employeeName ==“stop”) ......等......
测试评估为true,因为Java创建了一个保存第一个字符串的对象,然后它注意到第二个字符串是相同的,因此它重新使用该对象,因此==比较是将对象与自身进行比较。 / p>
但是如果你从键盘或文件中读取employeeName,那么编译器当然不知道有人会输入什么,创建一个新对象来保存这个值,并且==比较两个不同的string对象返回false。