【问题标题】:Can't fix a 'java.util.NoSuchElement' error [closed]无法修复“java.util.NoSuchElement”错误[关闭]
【发布时间】:2025-12-31 03:05:11
【问题描述】:

我正在尝试制作一个程序,该程序为掷硬币生成“赢”或“输”,输出数据到文件中,并读取该数据以计算 平均,但我收到“java.util.NoSuchElementException错误。我不完全确定我为什么会得到这个.. 非常感谢您的帮助。

import java.util.Scanner;
import java.util.Random;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.File;
public class BottleCapPrize
{
    public static void main(String [] args) throws IOException
    {            
        int random;
        int loop = 1;
        double trials = 0;
        double winCounter = 0;
        double average;
        String token = "";

        //

        Scanner in = new Scanner(System.in);
        Random rand = new Random();
        PrintWriter outFile = new PrintWriter (new File("MonteCarloMethod.txt"));

        //User Input Trials
        System.out.print("Number of trials: ");
        trials = in.nextInt();

        //For loop (random, and print to file)
        average = 0;
        for(loop = 1; loop <= trials; loop++)
        {
            random = rand.nextInt(5);
            if(random == 1)
            {
                outFile.println("Trial: " + loop + " WIN!");
            }
            outFile.println("Trial: " + loop + " LOSE");
        }

        outFile.close();

        //read output 
        File fileName = new File("MonteCarloMethod.txt");
        Scanner inFile = new Scanner(fileName);
        while (inFile.hasNextLine())
        {
            token = inFile.next();
            if (token.equalsIgnoreCase( "WIN!" ))
            {
                winCounter++;
            }

        }

        //average and print average
        average = winCounter / trials * 100;
        outFile.println("Average number of caps to win: " + average);
        System.out.println("Average number of caps to win: " + average);

        }
    }

【问题讨论】:

  • 哪一行抛出java.util.NoSuchElementException
  • 能否包含完整的堆栈跟踪信息?

标签: java file loops random nosuchelementexception


【解决方案1】:

inFile.next() 更改为inFile.nextLine()

另外,您需要将if (token.equalsIgnoreCase( "WIN!" )) 更改为if(token.contains("WIN!")),否则它将永远不会通过(.equals 检查整​​行是否为“WIN!”并且只有“WIN!”,.contains 检查查看该行是否包含“WIN!”。)

【讨论】:

  • 不敢相信没有人注意到.equalsIgnoreCase 缺陷
【解决方案2】:

在读取循环中,您测试inFile.hasNextLine(),但尝试通过inFile.next() 获取下一个令牌。但是,有下一行并不一定意味着有下一个标记。

要么将hasNextLine() 更改为hasNext(),要么将next() 更改为nextLine()(前提是所有令牌都在不同的行上)。

【讨论】:

    最近更新 更多