2010-06-26 41 views
6

我正在尝试Java编程书籍中的几个练习。我的代码如下:Java中的“while”问题

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.next();替换employeeName = input.nextLine();,它不再跳过它。我想知道,有没有什么办法可以使它在使用employeeName = input.nextLine();时不会跳过输入?

在此先感谢您的帮助!

回答

7

我猜这是因为您在while循环中使用的!=测试比较了字符串以便引用相等。也就是说,它进行比较时,不仅仅是测试字符串是否具有相同的字符序列,它检查它们是否是完全相同的对象。但是,当Scanner创建String以包含从标准输入中读取的文本时,该String不会与代码中的字符串文字"stop"相同。它们是两个恰好具有相同内容的对象,但它们存在于内存中的不同位置,因此!=将它们视为不相等。

解决方案:==与平等

while (!"stop".equals(employeeName)) { 
13

在Java中使用equals方法比较字符串时,不是==或!=运算符。通过使用这些运算符,您可以简单地比较对象的引用而不是其内容。所以你的条件应该看起来像

while (!"stop".equals(employeeName)) 

请注意,“停止”是第一个,因为理论上你的employeeName变量可以为null。通过调用空对象的equals方法,代码不会抛出NullPointerException

+1

您可能是指'while(!“stop”.equals(employeeName))'以匹配示例代码的含义,对吧? – maerics 2010-06-26 02:54:06

+0

我喜欢'尤达'的表情:) – VoodooChild 2010-06-26 02:55:05

2

问题是您没有使用正确的结构,您需要使用equals()而不是==来比较String s。你想要的基本结构是:

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编码约定,包括间距和大括号放置。

+0

为什么downvote? – cletus 2010-06-26 02:58:20

+0

感谢关于while循环和编程约定的输入!我没有意识到我的间距和位置不同于它。 – bow 2010-06-26 03:06:45

0

同上以前的海报:开始你的循环是这样吧。

它在将employeeName初始化为“stop”时起作用,因为Java编译器会看到两个相同的字符串并重新使用该对象。那就是:

String employeeName =“stop”; if(employeeName ==“stop”) ... etc ...

该测试的计算结果为true,因为Java创建一个对象来保存第一个字符串,然后它注意到第二个字符串是相同的,因此它重新使用该对象,因此==比较是将一个对象与自己进行比较。

但是,如果您改为从键盘或文件中读取employeeName,现在编译器当然不知道某人会输入什么内容,会创建一个新对象来保存此值,并在两个不同的字符串对象返回false。