我的方法输出Error:java.util.InputMismatchException

时间:2013-02-01 00:39:39

标签: java runtime-error java.util.scanner

首先,我已经说过我对这一切都不熟悉了所以请对我这些人轻松一点。

我被赋予了创建一个名为loadLeague()的方法的任务,尽管我付出了很多努力,但事实证明这一过程非常艰难!我想知道你是否可以帮助我。任务本身就是关于足球联赛的表格。我的方法编译没有任何问题,但然后它在Main(或任何其他标准输出)上输出“InputMismatchException”错误。我真的把头发拉了下来(好吧,还剩下什么)我想知道我做错了什么,因为我已经阅读了所有关于Java的书籍!请问可爱的专家,请看下面我的代码,并指出我正确的方向?

谢谢一群人!!

P.S。我只是想对这个论坛说声谢谢,因为它帮助我完成了我在IT方面的第一份真正工作。我很少在这里发表评论或提问,但我每天晚上都会阅读其他人提出的意见和问题,这些对我的访谈非常有帮助。非常感谢你!

import java.io.*;
import java.util.*;

/**  
 * Class League - An instance of this class represents the teams in a
 * football (or similar) league. It provides a class method for creating
 * a new instance of League by reading the data for the teams from a CSV
 * file.
 * 
 * @author Lewis Jones 
 * @version 1.0
 */

public class League
{
   /* instance variables */
   private String name;  // The name of the league
   private Team[] teams; // An array to hold the teams in the league

   /**
    * Constructor for objects of class League. It sets the name of the league
    * to the String object provided as the first argument and initialises teams
    * to an array of the size provided as the second argument. This constructor 
    * is private as it is intended for use only by the class method loadLeague().
    */
   private League(String aName, int size)
   {
      super();
      this.name = aName;
      this.teams = new Team[size];
   }

   /* class method */
   /**
    * This method creates a new League object by reading the required details from
    * a CSV file. The file must be organised as follows:
    *     name(String), number of teams (int)
    *     team name(String), won(int), drawn(int), lost(int), for(int), against    (int)
    *        and so on for each team
    * Having created the new League object the method should create all the Team 
    * objects (using the data in the file to set their attributes) and add them 
    * to the teams array.
    */
   public static League loadLeague()
   {
      League theLeague = null;
      String pathname = OUFileChooser.getFilename();
      File aFile = new File(pathname);
      Scanner bufferedScanner = null;

      try
      {
         String leagueName;
         int numberOfTeams;

         String teamName;
         int won;
         int drawn;
         int lost;
         int goalsFor;
         int goalsAgainst;
         Scanner lineScanner;
         String currentLine;
         bufferedScanner = new Scanner(new BufferedReader(new FileReader (aFile)));    

         while (bufferedScanner.hasNextLine())
         {
            currentLine = bufferedScanner.nextLine();
            lineScanner = new Scanner(currentLine);
            lineScanner.useDelimiter(",");

            leagueName = bufferedScanner.next();
            numberOfTeams = bufferedScanner.nextInt();

            teamName = bufferedScanner.next();
            won = lineScanner.nextInt();
            drawn = lineScanner.nextInt();
            lost = lineScanner.nextInt();
            goalsFor = lineScanner.nextInt();
            goalsAgainst = lineScanner.nextInt();

            Team aTeam = new Team(lineScanner.next());
            aTeam.setWon(lineScanner.nextInt());
            aTeam.setDrawn(lineScanner.nextInt());
            aTeam.setLost(lineScanner.nextInt());
            aTeam.setGoalsFor(lineScanner.nextInt());
            aTeam.setGoalsAgainst(lineScanner.nextInt());
            Team[] teams = new Team[numberOfTeams];
            teams[numberOfTeams] = aTeam;
            numberOfTeams++;
            theLeague = new League(leagueName, numberOfTeams);
         }
      }  
      catch (Exception anException)
      {
         System.out.println("Error: " + anException);
      }
      finally
      {
         try
         {
            bufferedScanner.close();
         }
         catch (Exception anException)
         {
            System.out.println("Error: " + anException);
         }
      }
      return theLeague;
   }

   /* instance methods */

   /**
    * Displays the league table in tabular format to the standard output
    */
   public void display()
   {
      System.out.println(this.name);
      System.out.format("%20s %2s %2s %2s %2s %2s %2s %    2s\n","","P","W","L","D","F","A","Pt");
      for (Team eachTeam : this.teams)
      {
         System.out.format("%20s %2d %2d %2d %2d %2d %2d %2d\n",
                       eachTeam.getName(), eachTeam.getPlayed(), 
                       eachTeam.getWon(), eachTeam.getDrawn(), 
                       eachTeam.getLost(),eachTeam.getGoalsFor(), 
                       eachTeam.getGoalsAgainst(), eachTeam.getPoints());        
      }
   }

   /**
    * Arrange the elements of teams in their natural order. This will only
    * work if a natural order has been defined for the class Team.
    */
   public void sort()
   {
      // to be written later...
   }
}

编辑:下面是此任务附带的示例(输入)文件。我很抱歉。我完全忘了昨晚把它包含在我的帖子中。

Scottish League Division 1,10
Airdrie United ,3,2,11,14,25
Clyde          ,5,7,4,21,17
Dundee         ,7,2,7,21,18
Gretna         ,10,3,3,43,20
Hamilton Acas  ,7,5,4,19,20
Livingstone    ,6,6,4,21,15
Partick Thistle,8,4,4,25,29
Queen of South ,3,3,10,11,31
Ross County    ,4,4,8,14,24
St Johnstone   ,6,6,4,26,16

1 个答案:

答案 0 :(得分:2)

我确切地知道问题所在。您的输入文件格式不正确。例如,当您期望“int”时,您正在读取不同的格式,如字符串。由于我没有您的输入,以下是一个快速示例,向您展示如何生成异常:


示例文件包含以下行:

<强> Sample.txt的
1,8,6,3
1,2,的 无效 下,3个

正如您将看到的那样,由于第二行生成错误,因此只会打印Sample.txt的第一行。 的输出:
1,8,6,3,

Exception in thread "main" java.util.InputMismatchException
    at java.util.Scanner.throwFor(Scanner.java:909)
    at java.util.Scanner.next(Scanner.java:1530)
    at java.util.Scanner.nextInt(Scanner.java:2160)
    at java.util.Scanner.nextInt(Scanner.java:2119)
    at staxpro.StAXPro.main(StAXPro.java:35)
public static void main(String[] args) {
        try {
            Scanner bufferedScanner = new Scanner(new BufferedReader(new FileReader ("Sample.txt")));
            while (bufferedScanner.hasNextLine()) {
                String currentLine = bufferedScanner.nextLine();
                Scanner lineScanner = new Scanner(currentLine);
                lineScanner.useDelimiter(",");

                int first = lineScanner.nextInt();
                int second = lineScanner.nextInt();
                // Here is where I read a string than an int value
                // on the 2nd line of the input file
                int third = lineScanner.nextInt();
                int forth = lineScanner.nextInt();


                System.out.println(first + ", " + second + ", " + third + ", " + forth);
            }
        } catch (FileNotFoundException ex) {
            System.err.println(ex.getLocalizedMessage());
        }
    }

编辑:

只需快速查看代码+输入文件,我发现了另一个问题:

teamName = bufferedScanner.next();
            won = lineScanner.nextInt();
            drawn = lineScanner.nextInt();
            lost = lineScanner.nextInt();
            goalsFor = lineScanner.nextInt();
            goalsAgainst = lineScanner.nextInt();

            Team aTeam = new Team(lineScanner.next());
            aTeam.setWon(lineScanner.nextInt());
            aTeam.setDrawn(lineScanner.nextInt());
            aTeam.setLost(lineScanner.nextInt());
            aTeam.setGoalsFor(lineScanner.nextInt());
            aTeam.setGoalsAgainst(lineScanner.nextInt());
你能发现它吗?您阅读#wins,#drawns,等等,并将它们存储在赢得绘制丢失 goalsFor goalsAgainst ,但是当您要创建Team对象时,您将从扫描仪中读取NEXT值。所以基本上,你将永远阅读其他每一行!!删除所有内容,但改为保留此部分:

        Team aTeam = new Team(lineScanner.next());
        aTeam.setWon(lineScanner.nextInt());
        aTeam.setDrawn(lineScanner.nextInt());
        aTeam.setLost(lineScanner.nextInt());
        aTeam.setGoalsFor(lineScanner.nextInt());
        aTeam.setGoalsAgainst(lineScanner.nextInt());

基于以上所述,在输入文件中,每一行必须具有: 字符串 int int int int int < /强>
但是如果你注意到,你的第一行输入文件是:

Scottish League Division 1,10

字符串 int int 。解决这些问题你应该很高兴。 这只是我的观察,并没有实际运行您的代码。所以我可能会遗漏一些东西。如果您在解决这些问题后仍有问题,请与我联系。

编辑(2):
我修改了你的代码并进行了更正。我针对这个输入运行它:

Scottish League Division 1,10
Airdrie United ,3,2,11,14,25
Clyde          ,5,7,4,21,17
Dundee         ,7,2,7,21,18
Gretna         ,10,3,3,43,20
Hamilton Acas  ,7,5,4,19,20
Livingstone    ,6,6,4,21,15
Partick Thistle,8,4,4,25,29
Queen of South ,3,3,10,11,31
Ross County    ,4,4,4,14,24
St Johnstone   ,6,6,4,26,16


它工作正常。如果还有其他问题,请告诉我。

import java.io.*;
import java.util.*;

/**  
 * Class League - An instance of this class represents the teams in a
 * football (or similar) league. It provides a class method for creating
 * a new instance of League by reading the data for the teams from a CSV
 * file.
 * 
 * @author Lewis Jones 
 * @version 1.0
 */

public class League
{
   /* instance variables */
   private String name;  // The name of the league
   private Team[] teams; // An array to hold the teams in the league

   /**
    * Constructor for objects of class League. It sets the name of the league
    * to the String object provided as the first argument and initialises teams
    * to an array of the size provided as the second argument. This constructor 
    * is private as it is intended for use only by the class method loadLeague().
    */
   private League(String aName, Team[] teams)
   {
      super();
      this.name = aName;
      this.teams = teams;
   }

   /* class method */
   /**
    * This method creates a new League object by reading the required details from
    * a CSV file. The file must be organised as follows:
    *     name(String), number of teams (int)
    *     team name(String), won(int), drawn(int), lost(int), for(int), against    (int)
    *        and so on for each team
    * Having created the new League object the method should create all the Team 
    * objects (using the data in the file to set their attributes) and add them 
    * to the teams array.
    */
   public static League loadLeague()
   {
      League theLeague = null;
      String pathname = OUFileChooser.getFilename();
      File aFile = new File(pathname);
      Scanner bufferedScanner = null;

      try
      {
         String leagueName;
         int numberOfTeams;

         String teamName;
         int won;
         int drawn;
         int lost;
         int goalsFor;
         int goalsAgainst;
         Scanner lineScanner;
         String currentLine;
         bufferedScanner = new Scanner(new BufferedReader(new FileReader (aFile)));    
         boolean firstLine = true;
         List<Team> teamsList = new ArrayList<Team>();
         Team[] teams = null;
         while (bufferedScanner.hasNextLine())
         {
            currentLine = bufferedScanner.nextLine();
            lineScanner = new Scanner(currentLine);
            lineScanner.useDelimiter(",");

            if (firstLine) {
                // you originally used "bufferedScanner" which actually 
                // gets the values on the next line, not the current line
                leagueName = lineScanner.next();
                numberOfTeams = lineScanner.nextInt();
                firstLine = false;
                continue;
            }

            Team aTeam = new Team(lineScanner.next());
            aTeam.setWon(lineScanner.nextInt());
            aTeam.setDrawn(lineScanner.nextInt());
            aTeam.setLost(lineScanner.nextInt());
            aTeam.setGoalsFor(lineScanner.nextInt());
            aTeam.setGoalsAgainst(lineScanner.nextInt());
            teamsList.add(aTeam);

         }
         teams = teamsList.toArray(new Team[]{});
         theLeague = new League(leagueName, teams);
      }  
      catch (Exception anException)
      {
         System.out.println("Error: " + anException);
      }
      finally
      {
         try
         {
            bufferedScanner.close();
         }
         catch (Exception anException)
         {
            System.out.println("Error: " + anException);
         }
      }
      return theLeague;
   }

   /* instance methods */

   /**
    * Displays the league table in tabular format to the standard output
    */
   public void display()
   {
      System.out.println(this.name);
      System.out.format("%20s %2s %2s %2s %2s %2s %2s %    2s\n","","P","W","L","D","F","A","Pt");
      for (Team eachTeam : this.teams)
      {
         System.out.format("%20s %2d %2d %2d %2d %2d %2d %2d\n",
                       eachTeam.getName(), eachTeam.getPlayed(), 
                       eachTeam.getWon(), eachTeam.getDrawn(), 
                       eachTeam.getLost(),eachTeam.getGoalsFor(), 
                       eachTeam.getGoalsAgainst(), eachTeam.getPoints());        
      }
   }

   /**
    * Arrange the elements of teams in their natural order. This will only
    * work if a natural order has been defined for the class Team.
    */
   public void sort()
   {
      // to be written later...
   }
}