2010-06-26 14 views
6

Tôi đang thử một số bài tập từ một cuốn sách lập trình Java. Tôi có mã bên dưới:Vấn đề với "while" trong 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 

Vấn đề là, vòng lặp while dường như không hoạt động. Bất cứ khi nào tôi nhập "stop" là employeeName, chương trình chỉ tiếp tục. Tôi đã thử thay thế "stop" bằng bất kỳ String nào khác và nó vẫn không hoạt động. Nhưng khi tôi thử khởi tạo employeeName với "stop", chương trình sẽ thoát ngay lập tức. Tôi làm gì sai ở đây?

Hơn nữa, sau vòng lặp đầu tiên, chương trình luôn bỏ qua yêu cầu employeeName. Tôi đã thử thay thế employeeName = input.nextLine(); bằng employeeName = input.next(); và nó không bỏ qua nữa. Tôi tự hỏi, có cách nào tôi có thể làm cho nó không bỏ qua đầu vào khi sử dụng employeeName = input.nextLine();?

Cảm ơn bạn đã trợ giúp!

Trả lời

7

Tôi đoán đó là vì kiểm tra != bạn sử dụng trong vòng while so sánh các chuỗi để bình đẳng tham chiếu. Tức là, khi nó so sánh, nó không chỉ kiểm tra xem liệu các chuỗi có cùng chuỗi ký tự hay không; nó kiểm tra xem chúng có phải là đối tượng chính xác giống nhau không. Nhưng khi Scanner tạo một String để chứa văn bản đọc từ đầu vào chuẩn, String sẽ không có cùng một đối tượng như chuỗi ký tự "stop" trong mã của bạn. Họ là hai đối tượng chỉ xảy ra để có cùng một nội dung, nhưng chúng tồn tại ở các vị trí khác nhau trong bộ nhớ, do đó, != đối xử với chúng như là không bình đẳng.

Giải pháp: bắt đầu vòng lặp của bạn như thay vì điều này:

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

Khi so sánh các chuỗi trong Java sử dụng phương thức bằng, không phải == hoặc! = Toán tử. Bằng cách sử dụng các toán tử đó, bạn chỉ cần so sánh các tham chiếu đến các đối tượng chứ không phải nội dung của chúng. Vì vậy, tình trạng của bạn sẽ trông như thế

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

Lưu ý rằng "dừng" là lần đầu tiên bởi vì về mặt lý thuyết biến employeeName của bạn có thể được null. Bằng cách này, mã sẽ không ném NullPointerException bằng cách gọi phương thức equals trên đối tượng null.

+1

Bạn có thể có nghĩa là 'while (!" Stop ".equals (employeeName))' để khớp với ý nghĩa của mã ví dụ, phải không? – maerics

+0

Tôi thích biểu thức 'Yoda' :) – VoodooChild

2

Vấn đề là bạn không sử dụng đúng cấu trúc và bạn cần sử dụng equals() không == để so sánh String s. Cấu trúc cơ bản bạn muốn là:

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

Về cơ bản, bạn cần kiểm tra xem người dùng đã nhập "dừng" ngay lập tức hay chưa. Phiên bản của bạn không.

Trên một lưu ý phụ, hãy thử và áp dụng các quy ước mã hóa Java bao gồm khoảng cách và vị trí dấu ngoặc nhọn.

+0

Tại sao lại là downvote? – cletus

+0

Cảm ơn bạn đã nhập thông tin về vòng lặp while và các quy ước lập trình! Tôi không nhận ra khoảng cách và vị trí của tôi khác với nó. – bow

0

Ditto áp phích trước trên == so với chiều sâu.

Nó hoạt động khi bạn khởi tạo employeeName để "dừng" vì trình biên dịch Java thấy hai chuỗi giống nhau và sử dụng lại đối tượng. Đó là:

Chuỗi employeeName = "stop"; nếu (employeeName == "stop") ... v.v ...Bài kiểm tra đánh giá đúng vì Java tạo một đối tượng để giữ chuỗi đầu tiên, sau đó nó nhận thấy rằng chuỗi thứ hai là giống hệt nhau để nó tái sử dụng đối tượng, và do đó so sánh == so sánh một đối tượng với chính nó. Nhưng nếu thay vào đó bạn đọc employeeName từ bàn phím hoặc tệp, bây giờ trình biên dịch tất nhiên không biết người nào sẽ nhập vào, một đối tượng mới được tạo để giữ giá trị này và một so sánh == giữa hai các đối tượng chuỗi khác nhau trả về false.