NoSuchElementException不断被触发,我不确定为什么

时间:2019-08-07 17:29:29

标签: java nosuchelementexception

基本上,我的程序的目的是从文本文件中选择一个随机引号,然后根据生成的随机数打印该引号,该随机数不大于文件中的行数。我知道该文件位于正确的目录中,并且包含所有内容。

我尝试同时使用while和for循环,但是这似乎是一个问题,当循环不在其中时,代码会正确运行,但是如果没有循环,程序就不会执行我想要的操作做。另外,尝试更改某些变量的范围。

// open file
private static void openFile(){

    try {
        input = new Scanner(Paths.get("Quotes.txt"));
    }
    catch(IOException ioException){
        System.err.println("Error opening file. Terminating.");
        System.exit(1);
    }
}

// get and print quote
private static void printQuote(){

    try {
        int printQue = randomNumber();

        System.out.println(printQue);
        for (int i = 0; i < printQue - 1; i++){
            input.nextLine();
        }

        System.out.printf("The randomly selected quote is: %s%n", 
        input.nextLine());
    }
    catch(NoSuchElementException elementException){
        System.err.println("File formed improperly. Terminating.");
    }
    catch(IllegalStateException stateException){
        System.err.println("Error reading from file. Terminating.");
    }
}

// size of list
private static int fileSize(){

    try{
        int counter = 0;
        while (input.hasNext()){
            input.nextLine();
            counter++;
        }

        num = counter;
    }
    catch(NoSuchElementException elementException){
        System.err.println("File improperly formed. Terminating");
    }
    catch(IllegalStateException stateException){
        System.err.println("Error reading from file. Terminating.");
    }

    return num;
}

// get random number
private static int randomNumber(){

    int randomNum = random.nextInt(fileSize());

    while (randomNum <= 0){
        randomNum = random.nextInt(fileSize());
    }

    return randomNum;
}

在文本文件中打印100个引号之一。

1 个答案:

答案 0 :(得分:0)

您的扫描程序正在遍历fileSize()方法中的整个文件,因为您每次迭代都调用input.nextLine()

一旦进入printQuote(),您就已经遍历了整个文件,因此您尝试在(last_index + 1)处读入一行。