2015-12-11 14 views
5

Ai đó có thể vui lòng giúp giải thích lý do tại sao điều này là ném một ngoại lệ NoSuchElement? Dường như nó xảy ra ở dòng cuối cùng scan.nextInt();NoSuchElement Exception

Tôi đang cố đọc tên từ một tệp và sắp xếp chúng thành một mảng rồi đọc trong tùy chọn từ người dùng sau khi in.

import java.util.ArrayList; 
import java.util.Collections; 
import java.io.File; 
import java.io.FileNotFoundException; 
import java.util.NoSuchElementException; 
import java.util.Scanner; 

public class DeletingNames { 

    public static void main(String[] args)throws Exception { 
     int addDelete = 0; 
     int index = 0; 
     String addName; 
     String deleteName; 

     File namesFile = new File("names.txt"); 

     ArrayList<String> names = new ArrayList<String>(); 

     try { 
      Scanner scan = new Scanner(namesFile); 

      while(scan.hasNext()){ 
       names.add(scan.next()); 
       index++; 
      } 

      Collections.sort(names); 

      System.out.println(names); 
      System.out.println(); 

      System.out.print("Add/delete data?\n1. Add\n2. Delete"); 

      addDelete = scan.nextInt(); 

      scan.close(); 
     } 

     catch (FileNotFoundException e){ 
      System.err.println("File not found"); 
     } 
    } 
} 
+0

Đầu vào của bạn sau khi "Thêm/xóa dữ liệu? \ N1. Thêm \ n2. Xóa"? – Rehman

Trả lời

3

bạn Scanner vẫn tham khảo file không System.in:

scan.close(); 
scan = new Scanner(System.in); 
addDelete = scan.nextInt(); 

Bạn đã trải qua toàn bộ tập tin vì vậy không có nhiều yếu tố. Đó là lý do tại sao bạn đang nhận được NoSuchElement ngoại lệ ...

1

Từ Javadoc:

Một NoSuchElementException được ném theo phương pháp nextElement của một Enumeration để chỉ ra rằng không có nhiều yếu tố trong điều tra.

Dòng chảy thực hiện sẽ không rời khỏi vòng lặp này

while(scan.hasNext()){ 
    names.add(scan.next()); 
    index++; 
} 

.... 
// 'scan' here is invalid, create a new System.in scanner 
System.out.print("Add/delete data?\n1. Add\n2. Delete"); 
addDelete = scan.nextInt(); // Invalid call 

khối mã cho đến khi không có nhiều yếu tố để đọc từ tập tin văn bản. Vì vậy, hãy gọi scan.nextInt() sẽ ném một số NoSuchElementException. Bạn cần có Scanner mới để đọc dữ liệu nhập của người dùng.

1

Vòng lặp while của bạn đi qua mọi thứ trong máy quét (scan.hasNext();), vì vậy không có gì còn lại khi bạn đến "addDelete = scan.nextInt();"

Nếu bạn muốn nhận dữ liệu nhập từ người dùng, bạn cần phải tạo một máy quét mới.

0

NoSuchElementException sẽ bị hủy nếu không có thêm mã thông báo. Điều này được gây ra bằng cách gọi nextInt() mà không kiểm tra nếu có bất kỳ số nguyên nào có sẵn. Trường hợp ngoại lệ này được ném ra để cho biết rằng không có thêm phần tử nào trong một điều tra. Ngoại lệ này mở rộng lớp RuntimeException và do đó, thuộc về những ngoại lệ có thể được ném trong khi hoạt động của Máy ảo Java (JVM). Đó là một ngoại lệ không được kiểm soát và do đó, nó không cần phải được khai báo trong mệnh đề ném của phương thức hoặc của hàm tạo. Cuối cùng, NoSuchElementException tồn tại kể từ phiên bản Java đầu tiên.

java.util.NoSuchElementException là một RuntimeException có thể được ném bởi các lớp khác nhau trong Java như Iterator, Enumerator, Scanner hoặc StringTokenizer.

Theo Javadoc NoSuchElementException được ném bởi phương pháp kế tiếpPhương pháp liệt kê để chỉ ra rằng không có thêm phần tử nào trong liệt kê.

Để ngăn điều đó xảy ra, bạn có thể xem xét sử dụng hasNext() để kiểm tra xem có thêm mã thông báo nào không.