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