2010-06-26 11 views
6

Sto provando diversi esercizi da un libro di programmazione Java. Ho il codice qui sotto:Problema con "while" in 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 

Il problema è che il ciclo while non sembra funzionare. Ogni volta che inserisco "stop" come employeeName, il programma va avanti. Ho provato a sostituire "stop" con qualsiasi altra stringa e ancora non funziona. Ma quando provo a inizializzare employeeName con "stop", il programma si chiude immediatamente, il che è previsto. Cosa sto facendo di sbagliato qui?

Inoltre, dopo il primo ciclo, il programma salta sempre chiedendo a employeeName. Ho provato a sostituire employeeName = input.nextLine(); con employeeName = input.next(); e non lo salta più. Mi chiedo però, c'è un modo in cui posso farlo saltare l'input quando si utilizza employeeName = input.nextLine();?

Grazie in anticipo per l'aiuto!

risposta

7

Suppongo che sia perché il test != utilizzato nel ciclo while confronta le stringhe per l'uguaglianza di riferimento. Cioè, quando fa un confronto, non è solo un test per vedere se le stringhe hanno la stessa sequenza di caratteri; controlla se sono lo stesso identico oggetto. Ma quando lo Scanner crea un String per contenere il testo letto dallo standard input, quello String non sarà lo stesso oggetto della stringa letterale "stop" nel codice. Sono due oggetti che hanno lo stesso contenuto, ma esistono in posizioni diverse nella memoria, quindi != li considera non uguali.

Soluzione: avviare il ciclo come questo, invece:

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

Quando si confrontano stringhe in Java, il metodo equals usa, non == o! = Operatori. Usando questi operatori si confronta semplicemente i riferimenti agli oggetti e non i loro contenuti. Quindi, la sua condizione dovrebbe essere simile

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

nota il che "stop" è in primo luogo perché in teoria la variabile employeeName può essere nulla. In questo modo il codice non rilascerà NullPointerException chiamando il metodo equals sull'oggetto null.

+1

Probabilmente si intende 'while (!" Stop ".equals (employeeName))' per corrispondere al significato del codice di esempio, giusto? – maerics

+0

Mi piace l'espressione 'Yoda' :) – VoodooChild

2

Il problema è che non si sta utilizzando la struttura corretta ed è necessario utilizzare equals() non == per confrontare String s. La struttura di base che si desidera è:

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(); 
} 

Fondamentalmente è necessario verificare se l'utente ha inserito "stop" immediatamente e quanto sopra fa. La tua versione no.

In una nota a margine, provare e adottare convenzioni di codifica Java tra cui spaziatura e posizionamento di parentesi graffe.

+0

Perché il downvote? – cletus

+0

Grazie per l'input sul ciclo while e le convenzioni di programmazione! Non mi rendevo conto che la mia spaziatura e il mio posizionamento erano diversi da questo. – bow

0

Idem manifesti precedenti sulla == contro eguali.

Funziona quando si inizializza employeeName su "stop" perché il compilatore Java vede due stringhe identiche e riutilizzato l'oggetto. Ovvero:

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

Il test restituisce vero perché Java crea un oggetto per tenere la prima stringa, allora nota che la seconda stringa è identica quindi ri-utilizza l'oggetto, e quindi il confronto == è confrontare un oggetto a se stesso.

Ma se invece si legge employeeName dalla tastiera o da un file, ora il compilatore ovviamente non sa che cosa scriverà qualcuno, verrà creato un nuovo oggetto per contenere questo valore e un == compare tra due oggetti stringa diversi restituiscono false.