Проблема, с “в то время как” в Java

Я испытываю несколько упражнений из книги программирования 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

Проблема, цикл с условием продолжения, кажется, не работает. Каждый раз, когда я ввел "остановку" как employeeName, программа просто продолжается. Я пытался заменить "остановку" любой другой Строкой, и она все еще не работает. Но когда я пытаюсь инициализировать employeeName с "остановкой", выходы программы сразу же, который ожидается. Что я делаю неправильно здесь?

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

Заранее спасибо за справку!

6
задан bow 26 June 2010 в 02:45
поделиться

4 ответа

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

Решение: вместо этого запустите цикл следующим образом:

while (!"stop".equals(employeeName)) {
7
ответ дан 8 December 2019 в 05:20
поделиться

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

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

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

13
ответ дан 8 December 2019 в 05:20
поделиться

Проблема в том, что вы используете неправильную структуру, и вам нужно использовать 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
ответ дан 8 December 2019 в 05:20
поделиться

Присоединяюсь к предыдущим постерам по поводу == против equals.

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

String employeeName="stop"; if (employeeName=="stop") ... и т.д. ...

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

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

0
ответ дан 8 December 2019 в 05:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: