Java中“while”的问题

时间:2010-06-26 02:45:10

标签: java loops while-loop

我正在尝试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();时,有什么方法可以让它不跳过输入?

提前感谢您的帮助!

4 个答案:

答案 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。