别紧张,我自学成才,对这一切都很陌生。所以我试着写一本通讯录。一切都很好,没有错误,没有例外。保存了项目,换了笔记本电脑,去吃午饭了。回来后,尝试运行代码,收到一个错误。
根据例外情况,我知道这与我的扫描仪有关。异常突出显示
int phone = inFile.nextInt()
作为问题。但我不知道它出了什么问题。
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 test.AddressBook.main(AddressBook.java:255)
代码
public class AddressBook
{
static Scanner inFile;
static FileWriter outFile;
static ArrayList<extPerson> person;
static extPerson record;
static File fileName = new File("AddressBook.txt");
private boolean b;
这是Main的代码。
public static void main(String[]args) throws IOException
{
int option = 0;
int n = 0;
AddressBook ab = new AddressBook();
inFile = new Scanner(new FileReader(fileName)).useDelimiter("[|\n]");
//System.out.println(inFile.delimiter());
//int count = 0;
while(inFile.hasNext())
{
String fName = inFile.next();
//System.out.print(fName);
String mName = inFile.next();
//System.out.print(mName);
String lName = inFile.next();
//System.out.print(lName);
int phone = inFile.nextInt();
//System.out.println(phone);
String relationship = inFile.next();
//System.out.print(relationship);
int day = inFile.nextInt();
//System.out.print(day);
int month = inFile.nextInt();
//System.out.print(month);
int year = inFile.nextInt();
//System.out.print(year);
String street = inFile.next();
//System.out.print(street);
String city = inFile.next();
//System.out.print(city);
String state = inFile.next();
//System.out.print(state);
String zipCode = inFile.next();
//System.out.println(zipCode);
record = new extPerson(fName, mName, lName, phone, relationship,
day, month, year, street, city, state, zipCode);
person.add(record);
}
while (true)
{
String input = JOptionPane.showInputDialog(
"Please Enter a number indicating your choice of action:"
+ "nEnter 1 To Add Record"
+ "nEnter 2 To Search Record By Last Name"
+ "nEnter 3 To Delete Record"
+ "nEnter 4 To Modify Record"
+ "nEnter 5 To Display All Records"
+ "nEnter 6 To Exit");
if((input != null)&&(input.isEmpty() != true))
{
option = Integer.parseInt(input);
if((option > 0 ) && (option < 7))
{
switch (option) {
case 1:
ab.addRecord();
break;
case 2:
ab.searchRecord();
break;
case 3:
ab.deleteRecord();
break;
case 4:
ab.modifyRecord();
break;
case 5:
ab.allRecord();
break;
case 6:
System.exit(0);
}
}
else if(option == JOptionPane.CLOSED_OPTION)
{
n = JOptionPane.showConfirmDialog(null, "Are you sure you want to close?");
if(n == JOptionPane.YES_OPTION)
System.exit(0);
}
}
else if (input == null)
{
n = JOptionPane.showConfirmDialog(null, "Are you sure you want to close?",
"Confirm",
JOptionPane.YES_NO_OPTION,JOptionPane.QUESTION_MESSAGE);
if(n == JOptionPane.YES_OPTION)
System.exit(0);
}
else
{
System.out.println("Invalid option. Please try again.");
}
}
}
我只需要有人给我指明正确的方向,并可能向我解释是什么导致了这种异常。如有任何帮助,我们将不胜感激。如果你需要更多的代码来分析这个问题,请告诉我,我会把它发布出来。再次感谢。
编辑样本数据
Jeremy|Ronald|Wright|4331732|Family Member|06|04|2013|Eastlawn|Orange Cove|Texas|06666-9139
Heather|Paula|Perkins|7285248|Friends|04|06|2013|Bashford|Yuba City|New Mexico|99585-6820
Edward|Stephen|Allen|7186971|Family Member|25|06|2013|Reinke|Downey|Arizona|15915-9508
Dorothy|Philip|Robinson|8932173|Business Associate|15|07|2013|Harper|La Verne|Montana|37275-3957
Joan|Harry|Wilson|3859088|Business Associate|01|02|2014|Eastlawn|Antioch|Maryland|85923
逐行拆分和解析将有助于避免此类问题。
while (inFile.hasNext()) {
String line = inFile.nextLine();
String[] tokens = line.split("\|");
String fName = tokens[0];
String mName = tokens[1];
String lName = tokens[2];
int phone = Integer.parseInt(tokens[3]);
String relationship = tokens[4];
int day = Integer.parseInt(tokens[5]);
int month = Integer.parseInt(tokens[6]);
int year = Integer.parseInt(tokens[7]);
String street = tokens[8];
String city = tokens[9];
String state = tokens[10];
String zipCode = tokens[11];
}
用你的文本文件片段做这件事对我来说很好。
在Java中,一些分隔符拆分器使用空/空标记,而另一些则不使用。如果您有||
或|notInt|
,并且恰好运行了scanner.nextInt()
,则会得到ImputMismatchException
Scanner i =
new Scanner("Jeremy|Ronald|Wright|43|||Family Member|06|04|2013|06666-9139n").useDelimiter("[|\n]");
while (i.hasNext()) {
for (int j = 0; j < 3; j++) {
System.out.println(i.next());
}
for (int j = 3; j < 6; j++) {
int loc = i.nextInt(); // here i get same exception
// when reading next int after 43
System.out.println(loc);
}
}
带有分隔符和字符串拆分器的扫描器处理空令牌,而StringTokenizer不处理,运行以下代码
System.out.println("------Scanner Delimiter------------------------------");
Scanner i =
new Scanner("Jeremy|Ronald|433|||06|04|2013|06666-9139").useDelimiter("[|]");
while (i.hasNext()) {
System.out.println("""+i.next()+""");
}
System.out.println("---------------String split---------------------");
String[] result = "Jeremy|Ronald|433|||06|04|2013|06666-9139".split("[|]");
for(String s: result)
System.out.println("""+s+""");
System.out.println("-------------String Tokenizer-----------------------");
StringTokenizer st = new StringTokenizer("Jeremy|Ronald|433|||06|04|2013|06666-9139", "|");
while (st.hasMoreTokens()) {
System.out.println("""+st.nextToken()+""");
}
将输出:
------Scanner Delimiter------------------------------
"Jeremy"
"Ronald"
"433"
""
""
"06"
"04"
"2013"
"06666-9139"
---------------String split---------------------
"Jeremy"
"Ronald"
"433"
""
""
"06"
"04"
"2013"
"06666-9139"
-------------String Tokenizer-----------------------
"Jeremy"
"Ronald"
"433"
"06"
"04"
"2013"
"06666-9139"