从文件扫描时的InputMismatchError

时间:2015-04-19 22:18:59

标签: java inputmismatchexception

我试图将.txt文件中的数据读入我的程序,并且尽管看起来不应该输入InputMismatchErrors。

错误

**********HELLO***********
Which animal are you looking to check into the kennel?: 
Dog
Cat
cat //typed entry
Using file cats.txt
Exception in thread "main" java.util.InputMismatchException
at java.util.Scanner.throwFor(Unknown Source)
at java.util.Scanner.next(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
at KennelDemo.initialise(KennelDemo.java:82)
at KennelDemo.main(KennelDemo.java:337)

// The error occurs on this line:
infile.nextInt(); 
int feedsPerDay = infile.nextInt();

以下是代码段:

public class KennelDemo {
private String filename; // holds the name of the file
private Kennel kennel; // holds the kennel
private Scanner scan; // so we can read from keyboard
private String tempFileName;
private String dogsFile = "dogs.txt";
private String catsFile = "cats.txt";

/*
 * Notice how we can make this private, since we only call from main which
 * is in this class. We don't want this class to be used by any other class.
 */
private KennelDemo() {
    scan = new Scanner(System.in);
    boolean fileCorrect = false;
    do {

        System.out.print("Which animal are you looking to check into the kennel?: " + "\n");
        System.out.println("Dog");
        System.out.println("Cat");  
        tempFileName = scan.next();
        if(tempFileName.toLowerCase().equals("dog") || tempFileName.toLowerCase().equals("cat")) {
           filename = tempFileName.toLowerCase().equals("dog") ? dogsFile : catsFile;
           fileCorrect = true;
        }
        else {
          System.out.println("That is not a valid filename, please enter either 'Dog' or 'cat' in lowercase.");
        }
    }
        while(!fileCorrect);
}

/*
 * initialise() method runs from the main and reads from a file
 */
private void initialise() {
    kennel = new Kennel();

    System.out.println("Using file " + filename);

    // Using try-with-resource (see my slides from session 15)
    try(FileReader fr = new FileReader(filename);
        BufferedReader br = new BufferedReader(fr);
        Scanner infile = new Scanner(br)){

        String kennelName = infile.nextLine();
        int kennelSize = infile.nextInt();
        infile.nextLine();
        kennel.setCapacity(kennelSize);
        int numPets = infile.nextInt();
        infile.nextLine();
        kennel.setName(kennelName);
        for(int i=0; i < numPets; i++){
            String PetName = infile.nextLine();
            int numOwners = infile.nextInt();
            infile.nextLine();
            ArrayList<Owner> owners = new ArrayList<>();
            for(int oCount=0; oCount < numOwners; oCount++){
                String name = infile.nextLine();
                String phone = infile.nextLine();
                Owner owner = new Owner(name, phone);
                owners.add(owner);
            }
            //boolean mutualBoolean = infile.nextBoolean();
            infile.nextLine();
            String favFood = infile.nextLine();
            infile.nextInt(); 
            int feedsPerDay = infile.nextInt();

            Pet Pet = new Pet(PetName, owners, favFood, feedsPerDay);
            kennel.addPet(Pet);
        }

    } catch (FileNotFoundException e) {
        System.err.println("The file: " + " does not exist. Assuming first use and an empty file." +
                           " If this is not the first use then have you accidentally deleted the file?");
    } catch (IOException e) {
        System.err.println("An unexpected error occurred when trying to open the file " + filename);
        System.err.println(e.getMessage());
    }
}

和.txt文件(cats.txt)

DogsRUs
20
1
TestCat
1
TestOwner
12345
TestFood
3

我一直在努力解决这个问题几个小时(布尔的问题,我最终完全退出了程序,因为它让我感到烦恼)而且我已经几乎没有任何进展。我已经多次重写了.txt文件,以确保每一条数据都符合下一步读取的内容,但仍会引发错误。

提前致谢。

1 个答案:

答案 0 :(得分:2)

当您在第二个for循环中将所有者添加到列表后调用infile.nextLine();时,您正在跳过收藏的食物行,这意味着下次调用nextInt时会遇到String而不是有效的int。将此调用移至nextLine(),您应该没问题。

//boolean mutualBoolean = infile.nextBoolean();
infile.nextLine();
String favFood = infile.nextLine();
infile.nextInt(); 
int feedsPerDay = infile.nextInt();

变为

//boolean mutualBoolean = infile.nextBoolean();
String favFood = infile.nextLine();
int feedsPerDay = infile.nextInt();

此外,在阅读了喜欢的食物后,您无需致电infile.nextInt()(参见上面的代码),因为您已经在正确的行上了。

最后,您需要声明Scanner实例的所有内容如下:

Scanner infile = new Scanner(new File(filename));

而不是

FileReader fr = new FileReader(filename);
BufferedReader br = new BufferedReader(fr);
Scanner infile = new Scanner(br)