NoSuchElement例外

时间:2015-12-11 15:18:11

标签: java

有人可以帮忙解释为什么这会引发NoSuchElement例外吗?它似乎发生在最后一行scan.nextInt();

我正在尝试从文件中读取名称并将它们排序为数组,然后在打印后从用户读取选项。

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");
        }
    }
}

4 个答案:

答案 0 :(得分:3)

您的Scanner仍在引用file而不是System.in

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

您已经浏览了整个文件,因此没有更多元素。这就是为什么你得到NoSuchElement例外......

答案 1 :(得分: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来读取用户的输入。

答案 2 :(得分:1)

你的while循环遍历扫描程序中的所有内容(scan.hasNext();),所以当你来到&#34; addDelete = scan.nextInt();&#34; <时,什么都没有。 / p>

如果您想从用户那里获取输入,则需要创建一个新的扫描仪。

答案 3 :(得分:1)

如果没有更多令牌可用,则抛出NoSuchElementException。这是由调用nextInt()而不检查是否有任何可用整数引起的。 抛出此异常表示枚举中没有更多元素。 此异常扩展了RuntimeException类,因此属于在Java虚拟机(JVM)操作期间可能抛出的异常。它是一个未经检查的异常,因此,它不需要在方法或构造函数的throws子句中声明。 最后,自Java的第一个版本以来,存在NoSuchElementException。

java.util.NoSuchElementException是一个RuntimeException,它可以被Java中的不同类抛出,如Iterator,Enumerator,Scanner或StringTokenizer。

根据Javadoc NoSuchElementException由Enumeration的nextElement方法抛出,表示枚举中没有更多元素。

为了防止它发生,您可以考虑使用hasNext()检查是否有更多令牌可用。