2015-01-26 17 views
8

Đây là chương trìnhInput.nextInt() hoạt động chính xác như thế nào?

public class bInputMismathcExceptionDemo { 
public static void main(String[] args) { 
    Scanner input = new Scanner(System.in); 
    boolean continueInput = true; 
    do { 
     try { 
      System.out.println("Enter an integer:"); 
      int num = input.nextInt(); 

      System.out.println("the number is " + num); 
      continueInput = false; 
     } 
     catch (InputMismatchException ex) { 
      System.out.println("Try again. (Incorrect input: an integer is required)"); 
     } 
     input.nextLine(); 
    } 
    while (continueInput); 

} 
} 

Tôi biết nextInt() chỉ đọc các số nguyên không phải là "\n", nhưng tại sao chúng ta nên cần input.nextLine() để đọc "\n"? nó có cần thiết không ?? bởi vì tôi nghĩ rằng ngay cả khi không có input.nextLine(), sau khi nó quay trở lại try {}, số input.nextInt() vẫn có thể đọc số nguyên tiếp theo tôi nhập, nhưng trên thực tế nó là một vòng lặp vô hạn.

Tôi vẫn không biết logic đằng sau nó, hy vọng ai đó có thể giúp tôi.

+2

đọc http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html –

Trả lời

4

nhưng tại sao chúng ta cần input.nextLine() để đọc "\ n"? nó có cần thiết không ??

Có (thực sự rất phổ biến để làm điều đó), nếu không bạn sẽ tiêu thụ \n còn lại như thế nào? Nếu bạn không muốn sử dụng nextLine để tiêu thụ trái \n, sử dụng một đối tượng máy quét khác nhau (tôi không khuyên này):

Scanner input1 = new Scanner(System.in); 
Scanner input2 = new Scanner(System.in); 

input1.nextInt(); 
input2.nextLine(); 

hoặc sử dụng nextLine để đọc các giá trị số nguyên và chuyển nó sang int sau đó, do đó bạn sẽ không phải sử dụng ký tự dòng mới sau này.

6

Lý do cần thiết ở đây là do những gì xảy ra khi đầu vào không thành công.

Ví dụ, hãy thử gỡ bỏ các phần input.nextLine(), chạy chương trình một lần nữa, và khi nó yêu cầu đầu vào, nhập abc và nhấn Return

Kết quả sẽ là một vòng lặp vô hạn. Tại sao?

nextInt() sẽ cố đọc đầu vào đến. Nó sẽ thấy rằng đầu vào này không phải là số nguyên và sẽ ném ngoại lệ. Tuy nhiên, đầu vào sẽ không bị xóa. Nó vẫn sẽ là abc trong bộ đệm. Vì vậy, quay trở lại vòng lặp sẽ làm cho nó để thử phân tích cú pháp cùng một abc hơn và hơn.

Sử dụng nextLine() sẽ xóa bộ đệm, để đầu vào tiếp theo bạn đọc sau khi lỗi sẽ là đầu vào mới sau dòng sai bạn đã nhập.

+0

cảm ơn bạn, vì vậy nextLine() không chỉ rõ ràng "\ n", mà còn rõ ràng " abc "?? –

+0

Có. Nó đọc tất cả các ký tự lên đến và bao gồm phần cuối của dòng, và trả về dòng. Chuỗi nó trả về không bao gồm phần cuối của dòng, nhưng bạn không quan tâm đến giá trị trả về của nó trong trường hợp này, chỉ trong giá trị nó tiêu thụ, đó là toàn bộ dòng. – RealSkeptic

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