2015-12-11 3 views
5

Может кто-нибудь объяснить, почему это выбрасывает исключение NoSuchElement? Кажется, что это происходит на последней строке scan.nextInt();NoSuchElement Exception

Я пытаюсь читать имена из файла и сортировать их в массиве, а затем читать в настройках пользователя после печати.

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

Каков ваш ввод после «Добавить/удалить данные? \ N1. Добавить \ n2. Удалить"? – Rehman

ответ

3

Ваш Scanner еще ссылки на file не System.in:

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

Вы уже прошли через весь файл, поэтому нет больше элементов. Именно поэтому вы получаете NoSuchElement исключения ...

1

От Javadoc:

NoSuchElementException брошено методом nextElement в качестве Перечисления, чтобы указать, что нет больше элементов в перечисление.

поток исполнения не оставит эту петлю

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 

блок кода до тех пор, пока не останется больше элементов для чтения из текстового файла. Поэтому вызов scan.nextInt() будет вызывать NoSuchElementException. Чтобы прочитать ввод пользователя, вам понадобится новый Scanner.

1

Ваш цикл while проходит через все сканеры (scan.hasNext();), так что ничего не осталось, когда вы приходите в "addDelete = scan.nextInt();"

Если вы хотите принять участие от пользователя, вам необходимо создать новый сканер.

0

Исключить NoSuchElementException, если не доступно больше токенов. Это вызвано вызовом nextInt() без проверки наличия целого числа. Это исключение бросается, чтобы указать, что в перечислении больше нет элементов. Это исключение расширяет класс RuntimeException и, следовательно, относится к тем исключениям, которые могут быть выбраны во время работы виртуальной машины Java (JVM). Это неконтролируемое исключение и, следовательно, его не нужно объявлять в предложении throw или в конструкторе. И, наконец, исключение NoSuchElementException существует с первой версии Java.

java.util.NoSuchElementException - это исключение RuntimeException, которое может быть выбрано различными классами на Java, например, Iterator, Enumerator, Scanner или StringTokenizer.

Согласно Javadoc NoSuchElementException вызывается методом NextElement перечисления, указывающим, что в перечислении больше нет элементов.

Чтобы предотвратить это, вы можете использовать hasNext(), чтобы проверить, доступны ли еще токены.

Смежные вопросы