【问题标题】:NoSuchElement ExceptionNoSuchElement 异常
【发布时间】:2015-12-11 15:18:11
【问题描述】:

有人可以帮助解释为什么这会引发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");
        }
    }
}

【问题讨论】:

  • 您在“添加/删除数据?\n1.添加\n2.删除”之后的输入是什么?

标签: java


【解决方案1】:

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

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

您已经浏览了整个文件,因此没有更多元素。这就是为什么您会收到 NoSuchElement 异常...

【讨论】:

    【解决方案2】:

    来自Javadoc

    NoSuchElementException 由 an 的 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 来读取用户的输入。

    【讨论】:

      【解决方案3】:

      您的 while 循环会遍历扫描仪中的所有内容 (scan.hasNext();),因此当您执行“addDelete = scan.nextInt();”时将一无所有

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

      【讨论】:

        【解决方案4】:

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

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

        根据 Javadoc,NoSuchElementException 由枚举的 nextElement 方法引发,以指示枚举中没有更多元素。

        为防止这种情况发生,您可以考虑使用 hasNext() 检查是否还有可用的令牌。

        【讨论】:

          猜你喜欢
          • 2013-09-28
          • 2017-08-23
          • 1970-01-01
          • 2013-12-29
          • 1970-01-01
          • 1970-01-01
          • 2017-04-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多