使用scanner类读取文本文件获取InputMismatchException。我究竟做错了什么?

时间:2014-02-05 04:20:58

标签: java

我是Java的新手,并参考了Murach的Java书籍中的示例。我目前正在学习如何处理记录。我遇到了一个我似乎无法解决的问题。逻辑编译没有任何问题,但是当我尝试运行程序时,我在“ReadRecords”类的第23行得到“INputMismatchException”错误。我搜索了这个问题并搜索SOF关于这个问题,我确实找到了几个解决方案,但他们没有帮助。如果有人可以帮我解决这个问题,我将非常感激。我有这些课程:

  1. 记录类
  2. ReadRecords Class
  3. 记录类代码:

    class Records{
    
        public int id;              //ID
        public String name;         //NAME
        public String gender;       //GENDER
    
    }//CLASS
    

    ReadRecords类代码:

    import java.util.Scanner;
    import java.io.*;
    
    public class ReadRecords {
    
        //METHOD: MAIN
        public static void main(String[] args){ 
    
            Scanner input;                              
            final int MAX_LEN = 25;                     
            int counter = 0;                                
            String filePath = "files/records.txt";      
    
            Records[] rec = new Records[ MAX_LEN ];     
            File file;      
    
            try {
                file = new File( filePath );
                input = new Scanner( file );
    
                do{             
                    rec[counter].id = input.nextInt();      //INT
                    rec[counter].name = input.next();   //STRING
                    rec[counter].gender = input.next(); //STRING
                    ++counter;
                }
                while(rec[counter -1].id != 0);
            }
            catch ( IOException ex ){       
                System.out.println( "File access error" );  
                counter = 0;
            }//
    
            System.out.println(rec[0].name);
        }// 
    }//
    

    文本文件“records.txt”

    1, Adam, male
    2, Bella, female
    3, Charlie, male
    4, David, male
    5, Elizabeth, female
    6, Frank, male
    7, Ginger, female
    8, Harry, male
    9, Irene, female
    10, Jill, female
    

    谢谢。

    enter image description here

3 个答案:

答案 0 :(得分:2)

您正在搜索的输入是int,但您首先得到string,因此您获得inputMismatchException,因为扫描程序的默认分隔符是空格,

在你的文本文件中,你有“,”作为delimiter.so使用

input = new Scanner( file ).useDelimiter(", ");

其次rec[counter].id抛出NullPointerException,因为您最初将在数组中具有空值。所以改变如下所示

do{        
                Records record=new Records();
                record.id = input.nextInt();      //INT
                record.name = input.next();   //STRING
                record.gender = input.next(); //STRING
                rec[counter]=record;
                ++counter;
            }
            while(input.nextLine() != null);

答案 1 :(得分:1)

扫描仪的默认分隔符是空格,但在文本文件中,您有按空格分隔的数据以及新的行字符。因此,您需要将分隔符用作','以及'\ n \ r'。

您也可以将您的诡计条件更改为

while(input.hasNext()&&(input.next()!= null));

这是我的改编代码。简单来说,我删除了你的txt文件中的所有逗号,并使用以下模式作为分隔符 - [\ r \ n]。它成功地运行了。

import java.io.File;
import java.io.IOException;
import java.util.Scanner;
import java.util.regex.Pattern;

class Records
{

    public int id; // ID
    public String name; // NAME
    public String gender; // GENDER

}// CLASS

public class ReadRecords
{

    // METHOD: MAIN
    public static void main(final String[] args)
    {

        Scanner input = null;
        final int MAX_LEN = 25;
        int counter = 0;
        final String filePath = "records.txt";

        final Records[] rec = new Records[MAX_LEN];
        File file;

        try
        {
            file = new File(filePath);
            input = new Scanner(file);
            final Pattern pat = Pattern.compile("[ \r\n]");
            input.useDelimiter(pat);
            do
            {
                rec[counter] = new Records();
                rec[counter].id = input.nextInt(); // INT
                rec[counter].name = input.next(); // STRING
                rec[counter].gender = input.next(); // STRING
                ++counter;

            }
            while (input.hasNext() && (input.next() != null));
        }
        catch (final IOException ex)
        {
            System.out.println("File access error");
            counter = 0;
        }//

        System.out.println(rec[0].name);
    }//
}//

答案 2 :(得分:0)

我会诚实地使用不同的方法来访问文本文件。谷歌FileReader以及BufferedReader,它们是我被告知在我的介绍类中使用的文件访问器。我将在我提出的代码下面发布以获取从文本文件创建的Records对象。这绝不是最好的方法,但它确实完成了工作。请随意提出有关我使用的可能不熟悉的代码的问题。

    import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;


class Records {

    public int id;              //ID
    public String name;         //NAME
    public String gender;       //GENDER

}


public class ReadRecords {

    public static void main(String[] args) {

        String filePath = "records.txt";      

        ArrayList<Records> rec = new ArrayList<Records>();           

        try {
            FileReader fr = new FileReader(filePath);
            BufferedReader br = new BufferedReader(fr);
            String nextLine;
            String splitText[];

            while((nextLine = br.readLine())!= null){
                Records temp = new Records();
                splitText = nextLine.split(", ");
                temp.id = Integer.parseInt(splitText[0]);
                temp.name = splitText[1];
                temp.gender = splitText[2];
                rec.add(temp);

            }
            br.close();
        }
        catch ( IOException ex ){       
            System.out.println( "File access error" );  
        }//

        for (int i = 0; i < rec.size(); i++) {
            System.out.println("Record ID: " + rec.get(i).id 
                    + "\n" + "Record Name: " + rec.get(i).name + "\n" + "Record Gender: " + rec.get(i).gender);
        }
    }// 

}

另外,我建议下载一个IDE,例如Eclipse,以方便使用。