Я работаю над программой, которая импортирует библиотеку из сгенерированного файла. Файл генерируется правильно и найден сканером. Первая строка имеет один int, записанныйПолучение InputMismatchException при чтении int из файла со сканером
pw.println(cdarchive.getNumber());
В другом месте в коде. Кажется, эта часть работает нормально.
Это ошибка, я получаю:
Exception in thread "main" java.util.InputMismatchException
at java.util.Scanner.throwFor(Scanner.java:864)
at java.util.Scanner.next(Scanner.java:1485)
at java.util.Scanner.nextInt(Scanner.java:2117)
at java.util.Scanner.nextInt(Scanner.java:2076)
at no.hib.dat102.IO.readFile(IO.java:26)
at no.hib.dat102.Menu.start(Menu.java:34)
at no.hib.dat102.CdArchiveClient.main(CdArchiveClient.java:10)
Линия это относится к тому,
int libSize = in.nextInt();
Это мой метод:
public class IO {
static final String DELIMITER = "#";
public static CdArchiveADT readFile(String filename) {
Scanner in = null;
CdArchiveADT cda = null;
try
{
File f = new File(filename+".txt");
in = new Scanner(f);
System.out.println(f);
in.useDelimiter(DELIMITER);
int libSize = in.nextInt();
System.out.println("libSize" + libSize);
cda = new CdArchive(libSize);
for (int i=0; i<libSize;i++) {
int inId = in.nextInt();
String inTitle= in.next();
String inArtist = in.next();
String inLabel = in.next();
String inGenre = in.next();
int inYear = in.nextInt();
in.nextLine();
cda.addCd(new CD(inId, inArtist, inTitle, inYear, inGenre, inLabel));
System.out.println("Closing Scanner (input)");
in.close();
}
}
catch (FileNotFoundException e){
System.out.println("Config file not found!");
e.printStackTrace();
}
return cda;
}
EDIT:
This is the method that writes to the file:
public static void writeFile(CdArchiveADT cdarchive, String filename) throws IOException {
PrintWriter pw = null;
File file = null;
try {
file = new File(filename +".txt");
// Create the file if it does not already exist
file.createNewFile();
// Writing metadata
pw = new PrintWriter(new FileWriter(file, false));
pw.println(cdarchive.getNumber());
// Writing data, if CdArchive is not empty
if (cdarchive.getCdTable()[0] != null) {
for (int i = 0; i<cdarchive.getNumber(); i++) {
CD c = cdarchive.getCdTable()[i];
pw.print(c.getId()); pw.print(DELIMITER);
pw.print(c.getTitle()); pw.print(DELIMITER);
pw.print(c.getArtist()); pw.print(DELIMITER);
pw.print(c.getLabel()); pw.print(DELIMITER);
pw.print(c.getGenre()); pw.print(DELIMITER);
pw.print(c.getYear()); pw.println(DELIMITER);
}
}
}
catch (FileNotFoundException e)
{
System.out.println("File not found!");
e.printStackTrace();
}
finally
{
if (pw != null)
{
System.out.println("Closing PrintWriter");
pw.close();
}
}
}
ли вы проверить формат письменного файла? Исключение InputMismatchException указывает, что токен, который вы пытаетесь прочитать, не может быть интерпретирован как целое. –
Этот 'in.close()' * внутри * цикл будет убивать вашу программу, как только вы преодолеете текущее препятствие. Предлагайте вместо этого использовать try-with-resources. – Andreas
Покажите пример входного файла, поэтому мы можем лучше сказать вам, почему '#' не является хорошим разделителем для файла, содержащего терминаторы строк. Например. если первая строка представляет собой число, например '42', а вторая строка' # 'ограничена, например. '1 # Title # Artist # Label # Genre # 2017', то первый * токен * - это текст' 42 \ r \ n1', который определенно не является допустимым числом. – Andreas