Код работает некоторое время назад, затем "java.util.InputMismatchException"
Полегче, я самоучка и довольно новичок во всем этом. Поэтому я пытался написать адресную книгу. все работало нормально, без ошибок, без исключений. Спасли проект, переключили мой ноутбук, пошли на обед. Вернулся, попытался запустить код, получил ошибку.
Исходя из исключения, я знаю, что это как-то связано с моим сканером. Исключение выделено
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
2 ответа
Чтение построчного разбиения и синтаксический анализ помогут избежать подобных проблем.
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()
При запуске вы получите ImputMissmatchException
Scanner i =
new Scanner("Jeremy|Ronald|Wright|43|||Family Member|06|04|2013|06666-9139\n").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"