2017-09-28 2 views
2

J'essaye de taper un programme qui simule le système de demande d'une petite bibliothèque, mais je continue d'obtenir la même erreur.NumberFormatException lors de la simulation du système d'interrogation d'une petite bibliothèque

L'erreur est la suivante:

Exception in thread "main" java.lang.NumberFormatException: For input string: "10001  Emma" 
    at java.lang.NumberFormatException.forInputString(Unknown Source) 
    at java.lang.Integer.parseInt(Unknown Source) 
    at java.lang.Integer.parseInt(Unknown Source) 
    at assg4_user.BookDemo.readCatalog(BookDemo.java:51) 
    at assg4_user.BookDemo.main(BookDemo.java:20) 

Je ne suis pas sûr de savoir comment faire face. Si le code devait s'exécuter correctement, il demanderait à l'utilisateur d'entrer un ID de livre et s'il est répertorié dans le catalogue, il produirait le titre, l'auteur, etc. Sinon, il exécuterait la classe "BookNotFoundException".

Voici le fichier texte pour le catalogue:

Book ID-----Title------------------------ISBN#------------------Author---------------Fiction/Non-Fiction 
10001-------Emma---------------------0486406482----------Austen---------------F 
12345-------My_Life-------------------0451526554----------Johnson-------------N 
21444-------Life_Is_Beautiful-------1234567890----------Marin-----------------F 
11111--------Horse_Whisperer------1111111111------------Evans----------------F 

Et voici le code:

import java.io.*; 
import java.util.*; 

public class BookDemo { 

    static String catalogFile = "C:\\Users\\John\\workspace\\DataStructuresAssingments\\catalog.txt"; 
    static Book[] bookArray = new Book[100]; 
    static int bookCount = 0; 

    public static void main(String args[]) throws FileNotFoundException, IOException, BookNotFoundException { 

     // Read Catalog 
     readCatalog(); 

     System.out.println("Enter book id:"); 
     Scanner in = new Scanner(System.in); 
     int bookId = Integer.parseInt(in.nextLine()); 
     while (bookId != 0) { 
      bookSearch(bookArray, bookCount, bookId); 
      bookId = Integer.parseInt(in.nextLine()); 

     } 
     in.close(); 
    } 

    /** 
    * Reads catalog file using try-with-resources 
    */ 
    private static void readCatalog() throws FileNotFoundException, IOException { 
     String line; 
     try (BufferedReader br = new BufferedReader(new FileReader(catalogFile));) { 
      while ((line = br.readLine()) != null) { 
       String[] str = line.split(" "); 
       Book book = new Book(Integer.parseInt(str[0]), str[1], str[2], str[3], str[4].charAt(0)); 
       bookArray[bookCount] = book; 
       bookCount++; 
      } 
     } 
    } 

    /** 
    * Search Books 
    */ 
    private static void bookSearch(Book[] bookArr, int bookCount, Integer bookId) throws BookNotFoundException { 
     boolean found = false; 
     for (int i = 0; i < bookCount; i++) { 
      if (bookArr[i].getBookId().equals(bookId)) { 
       System.out.println(bookArr[i]); 
       found = true; 
       break; 
      } 
     } 

     if (!found) { 
      throw new BookNotFoundException("Book ID:" + bookId + " Not Found!"); 
     } 
    } 
} 
public class Book { 

    private Integer bookId; 
    private String bookName; 
    private String bookISBN; 
    private String bookAuthorLastName; 
    private String bookCategory; 

    public Book() { } 

    public Book(Integer bookId, String bookName, String bookISBN, String bookAuthorLastName, char category) { 
     this.bookId = bookId; 
     this.bookName = bookName; 
     this.bookISBN = bookISBN; 
     this.bookAuthorLastName = bookAuthorLastName; 

     if (category == 'F') { 
      this.bookCategory = "Fiction"; 
     } 
     else if (category == 'N') { 
      this.bookCategory = "Non-Fiction"; 
     } 
    } 

    // Getter methods skipped for brevity 

    @Override 
    public String toString() { 
     return "Book id:" + bookId + ", Title:" + bookName + ", ISBN:" + bookISBN + ", Author:" + bookAuthorLastName + "," + bookCategory; 
    } 
} 
public class BookNotFoundException extends Exception { 

    public BookNotFoundException() { } 

    public BookNotFoundException(String message) { 
     super(message); 
    } 
} 
+0

Il fonctionne bien pour moi, pourvu que je remplace toutes les occurrences d'un ou plusieurs tirets par un espace dans votre fichier, * et * supprimer la ligne d'en-tête .. –

Répondre

1

Y a-t-il des onglets dans le fichier d'entrée? ou plusieurs espaces? peut-être vous devez diviser les lignes comme celle-ci:

  String[] str = line.split("\\s+"); 
1

NumberFormatException est un RuntimeException il sera « slide par toi r gestion des exceptions normales si elle n'est pas gérée explicitement. Alors entourer votre parseInt avec un try-catch comme celui-ci

try { 
    bookId = Integer.parseInt(in.nextLine()); 
} catch (NumberFormatException e) { 
    throw new BookNotFoundException(); 
} 
+0

Merci pour la suggestion, mais Je cours toujours dans la même erreur. –

1

Je ne vais pas vous donner la solution tout ou la logique de votre problème. Vous obtenez cette erreur car vous essayez d'analyser une chaîne en nombre entier ("10001 Emma"). Integer.parseInt("1001") ne fonctionnera que si le paramètre passé est int et ne contient aucun caractère.

EDIT

Selon vos données de votre bookId ne contient que des données int. Maintenant, si vous voulez forcer l'utilisateur à l'entrée uniquement int données remplacent a avec la partie b ci-dessous:

a)

int bookId = Integer.parseInt(in.nextLine()); 

b)

int bookId; 

    while(true) 
    { 
     try 
     { 
      bookId = Integer.parseInt(in.nextLine()); 
     }catch(NumberFormatException e) 
     { 
      System.out.println("Only integer input is accepted."); 
      continue; 
     } 
     break; 
    } 

Faites la même chose pour la ligne 27: bookId = Integer.parseInt(in.nextLine());

1

readCatalog échoue avec parseInt. Pour déboguer, imprimez le paramètre à parseInt sur la console (dans ce cas, str[0]). Si ce n'est pas ce que vous attendez, il est temps d'imprimer toute la ligne et de commencer à expérimenter avec la façon dont fonctionne String.split() en Java et comment l'obtenir pour analyser votre ligne correctement.

+0

Je pense en réalité que son fichier contient des données comme ci-dessous: '10001 Emma 0486406482 Austen F' pas' 10001 ------- Emma ------------------- --0486406482 ---------- Austen --------------- F' parce qu'il obtient une erreur à la ligne 20: 'à assg4_user.BookDemo.main (BookDemo .java: 20) ' Bien que dans ce cas l'espace ne soit pas autorisé. –

+0

Si c'était le cas, '10001' analyserait proprement au lieu d'inclure 'Emma'. La vérité est que nous ne savons pas, et le processus de débogage est exactement la façon dont j'aborderais un comportement inattendu similaire dans quelque chose que j'essayais de faire. – orip

+0

si le fichier contenait '10001 ------- Emma --------------------- 0486406482 ---------- Austen-- ------------- F' il aurait eu l'exception comme: 'Exception dans le fil" principal "java.lang.NumberFormatException: Pour la chaîne d'entrée:" 10001 ------- Emma- -------------------- 0486406482 ---------- Austen --------------- F "' pas seulement 'Exception dans le fil" principal "java.lang.NumberFormatException: Pour la chaîne d'entrée:" 10001 Emma "'. Aussi, il demande une entrée ici rt? –

1

Je ne pouvez reproduire votre erreur en mettant un onglet derrière 10001.

10001⟶Emma  0486406482 

( étant un caractère de tabulation)

Vous divisez par un seul espace, donc 10001 et Emma ne sont pas deux éléments, mais un élément de tableau, et, bien sûr, ce n'est pas analysable comme un entier.

Vous pouvez résoudre ce problème en divisant par un ou plusieurs whitespace characters. Depuis split() accepte une expression régulière, vous pouvez simplement écrire ceci:

String[] str = line.split("\\s+"); 

Oh, et quelques autres choses:

  • Les propriétés dans la toute classe Book commencent par "livre". Il est généralement inutile de répéter le nom de la classe. Donc, id, name, isbn, authorLastName et category ira bien.
  • Vous pouvez utiliser un List au lieu d'un tableau. C'est plus élégant et vous n'avez pas à déclarer la taille au début. En outre, la variable bookCount n'est plus nécessaire, car vous pouvez obtenir la taille avec bookArray.size().
  • Avec Java 8, vous pouvez utiliser la programmation fonctionnelle pour rechercher le livre.

    private static void search(List<Book> books, Integer bookId) throws BookNotFoundException { 
        boolean found = books.stream() 
         .anyMatch(t -> { 
          System.out.println(t); 
          return Objects.equals(t.getBookId(), bookId); 
         }); 
    
        if (!found) { 
         throw new BookNotFoundException("Book ID: " + bookId + " Not Found!"); 
        } 
    }