1

首先,我已经说过我对这一切都是新手,所以请对我放轻松。

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

谢谢一群人!!

PS 我只想对这个论坛说声谢谢,因为它帮助我找到了我在 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
4

1 回答 1

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、...等并将它们存储在wondrawnslostgoalsForgoalsAgainst中,但是当您要创建 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());

所以基于上述,在你的输入文件中,每一行必须有: Stringintintintintint
但如果你注意到,你的输入文件的第一行是:

Scottish League Division 1,10

这是一个Stringintint。修复这些,你应该很高兴。这只是我的观察,并没有真正运行你的代码。所以我可能会遗漏一些东西。如果修复后仍有问题,请告诉我。

编辑(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...
   }
}


于 2013-02-01T01:41:19.747 回答