【问题标题】:Problem with "while" in JavaJava中的“while”问题
【发布时间】:2011-03-08 13:00:45
【问题描述】:

我正在尝试 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”作为员工姓名时,程序就会继续运行。我尝试用任何其他字符串替换“停止”,但它仍然不起作用。但是当我尝试用“stop”初始化employeeName 时,程序会立即退出,这是意料之中的。我在这里做错了什么?

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

提前感谢您的帮助!

【问题讨论】:

    标签: java loops while-loop


    【解决方案1】:

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

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

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

    【讨论】:

    • 您的意思可能是while (!"stop".equals(employeeName)) 与示例代码的含义相匹配,对吧?
    • 我喜欢“尤达”的表达方式:)
    【解决方案2】:

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

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

    【讨论】:

    • 感谢有关 while 循环和编程约定的输入!我没有意识到我的间距和位置与它不同。
    【解决方案3】:

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

    解决方案:改为这样开始循环:

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

    【讨论】:

      【解决方案4】:

      在 == 与 equals 上同上之前的海报。

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

      字符串员工姓名=“停止”; 如果(员工姓名==“停止”) ……等等……

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

      但是如果你从键盘或文件中读取employeeName,现在编译器当然不知道有人会输入什么,创建一个新对象来保存这个值,然后一个==比较两个不同的字符串对象返回 false。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-10
        • 2014-05-27
        • 1970-01-01
        • 1970-01-01
        • 2016-09-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多