2012-05-15 7 views
18

Tôi có một cái gì đó như thế này:Làm cách nào để xóa bộ đệm Trình quét trong Java?

Scanner in=new Scanner(System.in); 
    int rounds = 0; 
    while (rounds < 1 || rounds > 3) { 
     System.out.print("How many rounds? "); 
     if (in.hasNextInt()) { 
      rounds = in.nextInt(); 
     } else { 
      System.out.println("Invalid input. Please try again."); 
      System.out.println(); 
     } 
     // Clear buffer 
    } 
    System.out.print(rounds+" rounds."); 

Làm thế nào tôi có thể xóa bộ đệm?

Chỉnh sửa: Tôi đã thử những điều sau đây, nhưng nó không hoạt động đối với một số lý do:

while(in.hasNext()) 
    in.next(); 
+0

những gì bạn có ý nghĩa với "Clear đệm"? rõ ràng giao diện điều khiển (như cls dos lệnh)? –

+1

Tôi đang tìm một cái gì đó dọc theo dòng: 'while (in.hasNext()) in.next();'. Đối với một số lý do mà vòng lặp không hoạt động. –

Trả lời

6

Bạn không thể xóa bộ đệm của Trình quét một cách rõ ràng. Bên trong, nó có thể xóa bộ đệm sau khi một mã thông báo được đọc, nhưng đó là một chi tiết thực hiện bên ngoài tầm với của người lập trình.

23

Hãy thử điều này:

in.nextLine(); 

này tiếp nối câu Scanner đến dòng kế tiếp.

+3

Đôi khi có nhiều dòng được nhập, điều này chỉ hoạt động cho một dòng. –

+2

Làm như vậy cho nhiều dòng được nhập. – m0skit0

+0

Bạn sẽ nghĩ hasNextLine (hoặc hasNext) có thể được sử dụng để kiểm tra xem có thêm đầu vào không, nhưng điều này không hoạt động trong Java. Phương thức hasNextLine/hasNext luôn trả về true cho bàn phím (System.in). Cách duy nhất tôi đã tìm thấy để xóa tất cả dữ liệu đệm mà không chặn là mở một máy quét mới: in.close(); in = new Scanner (System.in); – Georgie

0

Chèn dòng

in.nextLine(); 
5

này nên sửa chữa nó ...

Scanner in=new Scanner(System.in); 
    int rounds = 0; 
    while (rounds < 1 || rounds > 3) { 
     System.out.print("How many rounds? "); 
     if (in.hasNextInt()) { 
      rounds = in.nextInt(); 
     } else { 
      System.out.println("Invalid input. Please try again."); 
      in.next(); // -->important 
      System.out.println(); 
     } 
     // Clear buffer 
    } 
    System.out.print(rounds+" rounds."); 
5

Sử dụng lệnh sau:

in.nextLine(); 

ngay sau khi

System.out.println("Invalid input. Please Try Again."); 
System.out.println(); 

hoặc sau dấu ngoặc nhọn sau (nơi bình luận của bạn liên quan đến nó).

Lệnh này tiến hành quét tới dòng tiếp theo (khi đọc từ một tệp hoặc chuỗi, điều này đơn giản là đọc dòng tiếp theo), do đó về cơ bản đang xả nó, trong trường hợp này. Nó xóa bộ đệm và chuẩn bị máy quét cho đầu vào mới. Nó có thể, tốt hơn, được sử dụng để xóa bộ đệm hiện tại khi người dùng đã nhập một đầu vào không hợp lệ (chẳng hạn như một chữ cái khi được yêu cầu cho một số).

Tài liệu của phương pháp này có thể được tìm thấy ở đây: http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#nextLine()

Hope this helps!

0

Hãy thử mã này:

Scanner in=new Scanner(System.in); 
    int rounds = 0; 
    while (rounds < 1 || rounds > 3) { 
     System.out.print("How many rounds? "); 
     if (in.hasNextInt()) { 
      rounds = in.nextInt(); 
     } else { 
      in.NextLine(); // to clear Scanner 
     //You can throw new InputMismatchException(); 
      System.out.println("Invalid input. Please try again."); 
      System.out.println(); 
     } 

    } 
    System.out.print(rounds+" rounds."); 
0

Một giải pháp là để đặt các đối tượng ngân hàng bên trong vòng lặp do-while trong chính vì vậy mà một đối tượng ngân hàng mới được tạo ra mỗi lần.

Tuy nhiên, điều này trình bày một số vấn đề nhất định, cụ thể là mảng tài khoản và biến số. Bạn có thể sửa lỗi này bằng cách đặt chúng trong bankUser.

static int count = 0; //don't forget to make count global and initialize 
public static void main(String[] args) { 


    int Choice; 
    //place the Acct array inside bankUser main or declare 
    //as global 
    bankAcct myAcct[] = new bankAcct[3]; 

    do 
    { //Place the bank object inside the do-while 
    Bank myBank = new Bank(count, myAcct); //pass the variables to the 
              //new Bank object 
    dispMenu(); 

    Choice = getChoice(); 

    proChoice(Choice, myBank); 

    } 
    while (Choice !=0); 
    } 

Đừng quên tính toàn cầu vì nó cần để có thể được chuyển vào đối tượng trong chính Và tăng lên bởi trường hợp chuyển đổi openAcct trong phương thức proChoice.

case 1: myBank.openAcct(); 
    count++; 
    break; 

Cuối cùng, bạn có thể chuyển mảng myAcct và biến đếm thông qua đối tượng bằng cách sử dụng hàm tạo trong lớp ngân hàng.

public Bank(int count, bankAcct myAcct[]) { 
this.count = count; 
this.myAcct = myAcct; 

}