Java中"while"的问题

bow*_*bow 6 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
Run Code Online (Sandbox Code Playgroud)

问题是,while循环似乎不起作用.每当我输入"stop"作为employeeName时,程序就会继续.我尝试用任何其他字符串替换"停止",它仍然无法正常工作.但是当我尝试使用"stop"初始化employeeName时,程序会立即退出,这是预期的.我在这做错了什么?

此外,在第一个循环之后,程序总是跳过询问employeeName.我尝试更换employeeName = input.nextLine();,employeeName = input.next();它不再跳过它.我想知道,有什么办法可以让它在使用时不会跳过输入employeeName = input.nextLine();

在此先感谢您的帮助!

Eug*_*kov 13

在Java中比较字符串时,使用equals方法,而不是==或!=运算符.通过使用这些运算符,您只需比较对象的引用而不是它们的内容.所以你的病情应该是这样的

while ( !"stop".equals(employeeName) )
Run Code Online (Sandbox Code Playgroud)

请注意,"stop"是第一个,因为理论上您的employeeName变量可以为null.这样代码就不会NullPointerException通过在null对象上调用equals方法来抛出.


Dav*_*d Z 7

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

解决方案:改为开始你的循环:

while (!"stop".equals(employeeName)) {
Run Code Online (Sandbox Code Playgroud)