2017-02-01 2 views
1

Я работаю над программой, которая импортирует библиотеку из сгенерированного файла. Файл генерируется правильно и найден сканером. Первая строка имеет один 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(); 
      } 
     } 
    } 
+0

ли вы проверить формат письменного файла? Исключение InputMismatchException указывает, что токен, который вы пытаетесь прочитать, не может быть интерпретирован как целое. –

+0

Этот 'in.close()' * внутри * цикл будет убивать вашу программу, как только вы преодолеете текущее препятствие. Предлагайте вместо этого использовать try-with-resources. – Andreas

+0

Покажите пример входного файла, поэтому мы можем лучше сказать вам, почему '#' не является хорошим разделителем для файла, содержащего терминаторы строк. Например. если первая строка представляет собой число, например '42', а вторая строка' # 'ограничена, например. '1 # Title # Artist # Label # Genre # 2017', то первый * токен * - это текст' 42 \ r \ n1', который определенно не является допустимым числом. – Andreas

ответ

0

я получил рабочий пример:

public static void main(String[] args) { 

    // write 
    String delimiter = "#"; 
    StringWriter stringWriter = new StringWriter(); 
    PrintWriter pw = new PrintWriter(stringWriter); 
    pw.println(3); 
    for (int i = 0; i < 3; i++) { 
     pw.print("id " + i); 
     pw.print(delimiter); 
     pw.print("titel " + i); 
     pw.print(delimiter); 
     pw.print("artist " + i); 
     pw.println(delimiter); 
    } 

    String theString = stringWriter.toString(); 
    System.out.println(theString); 

    try { 
     pw.close(); 
     stringWriter.close(); 
    } catch (IOException e) { 
     // ignore in example 
    } 

    // read 
    Scanner in = new Scanner(theString); 
    in.useDelimiter("\\s*#\\s*|\\s*\n\\s*"); // add new line as delimiter aswell 
    int libSize = in.nextInt(); 
    for (int i = 0; i < libSize; i++) { 
     String inId = in.next(); 
     String inTitle = in.next(); 
     String inArtist = in.next(); 
     in.nextLine(); 

     System.out.println("read: " + inId + ", " + inTitle + ", " + inArtist); 
    } 
    in.close(); 
} 

Дело в том, чтобы добавить новую строку в используемых разделителей как хорошо

+0

Это действительно сработало! Результат был не таким приятным.'3 0 \ s * # \ s * | \ s * \ s * Название 1 \ s * # \ s * | \ s * \ s * Исполнитель 1 \ s * # \ s * | \ s * \ s * Метка 1 \ s * # \ s * | \ s * \ s * ROCK \ s * # \ s * | \ s * \ s * 1 \ s * # \ s * | \ s * \ s * 1 \ s * # \ s * | \ s * \ s * Название 2 \ s * # \ s * | \ s * \ s * Исполнитель 2 \ s * # \ s * | \ s * \ s * Метка 2 \ s * # \ s * | \ s * \ s * АЛЬТЕРНАТИВА \ s * # \ s * | \ s * \ s * 2000 \ s * # \ s * | \ s * \ s * 2 \ s * # \ s * | \ s * \ s * Название 3 \ s * # \ s * | \ s * \ s * Исполнитель 3 \ s * # \ s * | \ s * \ s * Метка 3 \ s * # \ s * | \ s * \ s * POP \ s * # \ s * | \ s * \ s * 1 \ s * # \ s * | \ s * \ s * ' –

+0

Я сделал это, и теперь все работает отлично. Спасибо за ваше время и ценный совет! –

0

пытаются использовать

static final String DELIMITER = "\\s*#\\s*"; 

В противном случае все начальные или конечные пробелы будут вызывать эту ошибку.

+0

Маловероятно, чтобы устранить проблему, так как строки ввода не разделены символом '#'. Конечно, не видя фактического ввода, неизвестно, что такое вход. – Andreas

+0

Это, к сожалению, не устранило проблему для меня. –

Смежные вопросы