繁体   English   中英

为什么会收到“ java.util.NoSuchElementException”?

[英]Why am I getting a “java.util.NoSuchElementException”?

这是我得到的错误...

Exception in thread "main" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Unknown Source)
at java.util.Scanner.next(Unknown Source)
at Maze.Map.readFile(Map.java:60)
at Maze.Map.<init>(Map.java:23)
at Maze.Board.<init>(Board.java:16)
at Maze.Maze.<init>(Maze.java:15)
at Maze.Maze.main(Maze.java:9)

下面是我的代码!

package Maze;

import javax.swing.*;

public class Maze 
{

    public static void main(String[] args)

    {
        new Maze();
    }

    public Maze()

    {

        JFrame f = new JFrame();

        f.setTitle("Maze Game");

        f.add(new Board());
        f.setSize(464, 485);
        f.setLocationRelativeTo(null);
        f.setVisible(true);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

package Maze;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Board extends JPanel implements ActionListener
{

    private Timer timer;

    private Map m;

    public Board()
    {
        m = new Map();

        timer = new Timer(25, this);
        timer.start();
    }

    public void actionPerformed(ActionEvent e)
    {
        repaint();
    }

    public void paint(Graphics g)
    {
        super.paint(g);

        for(int y = 0; y < 14; y++)
        {
            for(int x = 0; x < 14; x++)
            {
                if(m.getMap(x, y).equals("g"))
                {
                    g.drawImage(m.getFloor(), x * 32, y * 32, null);
                }
                if(m.getMap(x, y).equals("w"))
                {
                    g.drawImage(m.getWall(), x * 32, y * 32, null);
                }
            }
        }

    }

}

package Maze;

import java.awt.*;
import java.io.*;
import java.util.*;
import javax.swing.ImageIcon;

public class Map 
{
    private Scanner m;
    private String Map[] = new String[14];
    private Image floor,
                  wall;    

    public Map()
    {
        ImageIcon img = new ImageIcon("C://Test//MazeGame//floor.jpg");
        floor = img.getImage();
        img = new ImageIcon("C://Test//MazeGame//wall.jpg");
        wall = img.getImage();

        openFile();
        readFile();
        closeFile();
    }

    public Image getFloor()
    {
        return floor;
    }

    public Image getWall()
    {
        return wall;
    }

    public String getMap(int x, int y)
    {
        String index = Map[y].substring(x, x + 1);
        return index;
    }

    public void openFile()
    {
        try
        {
            m = new Scanner(new File("C://Test//MazeGame//Map.txt"));
        }catch(Exception e)
            {
                System.out.print("Error Loading Map!");
            }
    }

    public void readFile()
    {
        while(m.hasNext())
        {
            for(int i = 0; i < 14; i++)
            {
                Map[i] = m.next();
            }
        }
    }



    public void closeFile()
    {
        m.close();
    }

}

我不知道这是否是您的错误(您没有告诉我们哪一行是Map类的60行,这是导致您异常的行),但这是危险的代码:

while(m.hasNext())
{
    for(int i = 0; i < 14; i++)
    {
        Map[i] = m.next();
    }
}

您每个循环迭代调用一次hasNext() ,但是调用next() 14次! 应该存在严格的一对一关联,因为每个next()应该与前面的hasNext()匹配。


另外,没有必要嵌套for循环,因为while循环将处理您需要的所有内容。 您可能会遇到类似这样的情况:

int i = 0;
while(m.hasNext()) {
   Map[i] = m.next();
   i++;
}

但是使用ArrayList而不是数组会更安全。


另外,请学习并遵循Java编码约定。 方法和字段/变量/参数都应以小写字母开头,因此不允许Map [i],而应该是map [i]。 这样做将有助于我们更好地理解和遵循您的代码,从而为您提供帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM