Проблема с "пока" в Java - PullRequest
       8

Проблема с "пока" в Java

6 голосов
/ 26 июня 2010

Я пробую упражнения из книги по программированию на 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, программа просто запускается. Я попытался заменить «стоп» любой другой строкой, и она все еще не работает. Но когда я пытаюсь инициализировать employeeName с помощью «stop», программа сразу же завершает работу, что ожидается. Что я тут не так делаю?

Кроме того, после первого цикла программа всегда пропускает запрос employeeName. Я попытался заменить employeeName = input.nextLine(); на employeeName = input.next();, и это больше не пропускается. Мне вот интересно, есть ли способ заставить его не пропускать ввод при использовании employeeName = input.nextLine();?

Заранее спасибо за помощь!

Ответы [ 4 ]

13 голосов
/ 26 июня 2010

При сравнении строк в Java используйте метод equals, а не == или! = Операторы. Используя эти операторы, вы просто сравниваете ссылки на объекты, а не их содержимое. Итак, ваше состояние должно выглядеть как

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

Обратите внимание, что «стоп» является первым, потому что теоретически ваша переменная employeeName может быть нулевой. Таким образом, код не будет выбрасывать NullPointerException, вызывая метод equals для нулевого объекта.

7 голосов
/ 26 июня 2010

Я предполагаю, что это потому, что тест !=, который вы используете в цикле while, сравнивает строки на равенство ссылок. То есть, когда он сравнивает, он не просто проверяет, имеют ли строки одинаковую последовательность символов; он проверяет, являются ли они точно такими же объектами . Но когда Scanner создает String для содержания текста, который он читает со стандартного ввода, то String не будет тем же объектом, что и строковый литерал "stop" в вашем коде. Это два объекта, которые просто имеют одинаковое содержимое, но они существуют в разных местах памяти, поэтому != рассматривает их как неравные.

Решение: вместо этого начните свой цикл:

while (!"stop".equals(employeeName)) {
3 голосов
/ 26 июня 2010

Проблема в том, что вы не используете правильную структуру, и вам нужно использовать 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, включая интервалы и размещение фигурных скобок.

0 голосов
/ 26 июня 2010

То же, что и у предыдущих постеров == против равно.

Работает, когда вы инициализируете employeeName для "остановки", потому что компилятор Java видит две идентичные строки и повторно использует объект.То есть:

String employeeName = "stop";if (employeeName == "stop") ... etc ...

Тест оценивается как true, потому что Java создает объект для хранения первой строки, затем замечает, что вторая строка идентична, поэтому-использует объект, и поэтому сравнение == сравнивает объект с самим собой.

Но если вместо этого вы читаете employeeName с клавиатуры или из файла, то теперь компилятор, конечно, не знает, что кто-то будетвведите, новый объект создается для хранения этого значения, и сравнение == между двумя различными строковыми объектами возвращает false.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...