2011-10-24 22 views
17

Tôi đang viết một chương trình đơn giản nhắc người dùng nhập một số học sinh, sau đó yêu cầu người dùng nhập tên và điểm của từng học sinh để xác định học sinh nào có điểm số cao nhất.Đầu vào Java String Scanner không chờ thông tin, di chuyển trực tiếp đến câu lệnh tiếp theo. Cách đợi thông tin?

Tôi đã viết mã chương trình và nó biên dịch. Dòng đầu tiên yêu cầu một số sinh viên và chờ đợi cho đầu vào. Dòng thứ hai được yêu cầu yêu cầu tên sinh viên và chờ đầu vào, sau đó dòng thứ ba sẽ in ans yêu cầu điểm số của học sinh đó và đợi đầu vào nhưng sau dòng thứ hai in, dòng thứ ba được gọi ngay (dòng thứ 2 không không chờ đợi cho đầu vào) và sau đó tôi nhận được một lỗi thời gian chạy khi cố gắng nhập thông tin được yêu cầu sau dòng thứ ba.

Làm cách nào để điều chỉnh mã để dòng thứ hai in và đợi chuỗi được nhập trước khi in dòng thứ ba?

import java.util.Scanner; 

public class HighestScore { 
    public static void main(String[] args) { 
     Scanner input = new Scanner(System.in); 

     System.out.print("Enter the number of students: "); 
     int numOfStudents = input.nextInt(); 

     System.out.print("Enter a student's name: "); 
     String student1 = input.nextLine(); 

     System.out.print("Enter that student's score: "); 
     int score1 = input.nextInt(); 

     for (int i = 0; i <= numOfStudents - 1; i++) { 

      System.out.println("Enter a student's name: "); 
      String student = input.nextLine(); 

      System.out.println("Enter that student's score: "); 
      int score = input.nextInt(); 

      if (score > score1) { 
      student1 = student; 
      score1 = score; 
      } 
     } 
     System.out.println("Top student " + 
     student1 + "'s score is " + score1); 
    } 
} 

Trả lời

14
System.out.print("Enter the number of students: "); 
    int numOfStudents = input.nextInt(); 
    // Eat the new line 
    input.nextLine(); 
    System.out.print("Enter a student's name: "); 
    String student1 = input.nextLine(); 
+0

Tuyệt vời! Nó hoạt động! Cảm ơn bạn! – user1011064

36

Đó là lý do tại sao tôi không không thích sử dụng một Scanner, vì hành vi này. (Một khi tôi hiểu những gì đang xảy ra, và cảm thấy thoải mái với nó, tôi thích Scanner rất nhiều).

Điều gì đang xảy ra là cuộc gọi đến nextLine() đầu tiên kết thúc dòng nơi người dùng nhập số học sinh. Tại sao? Bởi vì nextInt() chỉ đọc một int và không kết thúc dòng.

Vì vậy, việc thêm câu hỏi thêm readLine() sẽ giải quyết được sự cố này.

System.out.print("Enter the number of students: "); 
int numOfStudents = input.nextInt(); 

// Skip the newline 
input.nextLine(); 

System.out.print("Enter a student's name: "); 
String student1 = input.nextLine(); 

Như tôi đã đề cập, tôi không thích sử dụng Scanner. Những gì tôi sử dụng để làm là sử dụng một BufferedReader. Đó là công việc nhiều hơn, nhưng nó hơi đơn giản hơn những gì đang thực sự xảy ra. ứng dụng của bạn sẽ trông như thế này:

BufferedReader input = new BufferedReader(new InputStreamReader(System.in)); 

System.out.println("Enter the number of students: "); 
int numOfStudents = Integer.parseInt(input.readLine()); 

String topStudent = null; 
int topScore = 0; 
for (int i = 0; i < numOfStudents; ++i) 
{ 
    System.out.print("Enter the name of student " + (i + 1) + ": "); 
    String student = input.nextLine(); 

    // Check if this student did better than the previous top student 
    if (score > topScore) 
    { 
     topScore = score; 
     topStudent = student; 
    } 
} 
1

Wow trông giống như thiết kế xấu - nếu bạn yêu cầu một số nguyên một d làm một nextInteger() máy quét sẽ cung cấp cho bạn các số nguyên, nhưng nó bây giờ đang nắm giữ một dòng mới nhân vật trong bộ đệm của nó khi người dùng phải nhấn enter để gửi số nguyên, vì vậy nếu sau này bạn muốn nhắc người dùng cho một chuỗi nó sẽ không chờ đợi cho đầu vào và chỉ cung cấp cho bạn trở lại một ký tự dòng mới. Bạn không thể xóa máy quét để tránh loại sự cố này ...

Tôi đang thiếu gì?

Adam

Các vấn đề liên quan