2017-09-28 15 views
2

小さなライブラリの照会システムをシミュレートするプログラムを入力しようとしていますが、同じエラーが発生します。次のようにNumberFormatException小さなライブラリの照会システムをシミュレートするとき

エラーは次のとおりです。

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) 

私はそれに対処するかどうかはわかりません。コードが正しく実行されると、ユーザーにブックIDの入力を求め、カタログにリストされている場合はTitle、Authorなどを出力します。そうでなければ、 "BookNotFoundException"クラスを実行します。

ここではカタログのテキストファイルです:

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 

そして、ここでコード:

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

それは私があなたのファイル内のスペースによって一つ以上のダッシュの出現をすべて交換することを提供し、私が正常に動作し、*と* –

答えて

1

入力ファイルにタブがありますか?または複数のスペース?おそらくあなたは、このような行を分割する必要があります

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

はNumberFormatExceptionがのRuntimeExceptionそれがスライドしそうですあなたによって通常の例外処理は、明示的に処理されなければ処理されません。このようなtry-catchであなたのparseIntを囲みます。

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

が提案いただきありがとうございます。..ヘッダ行を削除しますが、私はまだ同じエラーが発生しています。 –

1

私はあなたに問題の全体的な解決策やロジックを教えません。 String to Integer("10001 Emma")を解析しようとしているため、このエラーが発生しています。 Integer.parseInt("1001")は、渡されたパラメータがintであり、文字を含まない場合にのみ機能します。

EDIT

は、あなたのデータによると、あなたのbookIdはint型のデータが含まれています。今、あなたが入力したユーザを強制したい場合は、データが下にb部分でaを置き換えるだけint型:

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; 
    } 

ライン27のために同じことを行います。bookId = Integer.parseInt(in.nextLine());

1

readCatalogparseIntで失敗しています。デバッグするには、パラメータをparseIntにコンソールに出力します(この場合はstr[0])。それが期待どおりでない場合は、行全体を印刷し、String.split()がJavaでどのように動作するか、そして行を正しく解析する方法を試してみてください。

+0

私は実際に彼のファイルには以下のようなデータが入っていると思います: '10001 Emma 0486406482 Austen F' not 10001 ------- Emma ------------------- --0486406482 ---------- Austen --------------- F' なぜなら、彼は20行目でエラーになるからです。 'at assg4_user.BookDemo.main(BookDemo .java:20) ' この場合、スペースは許されません。 –

+0

その場合、 '10001'は 'Emma'を含む代わりにきれいに解析します。真実はわかりません。デバッグのプロセスはまさに私がやろうとしていたことと同様の予期しない動作に近づく方法です。 – orip

+0

ファイルに '10001 ------- Emma --------------------- 0486406482 ---------- Austen-- ------------- F'彼は次のような例外があります: 'スレッド内の例外" main "java.lang.NumberFormatException:入力文字列:" 10001 ------- Emma- -------------------- 0486406482 ---------- Austen --------------- F "'スレッド例外 "main"でなくjava.lang.NumberFormatException:入力文字列: "10001 Emma" 'また、彼はここに入力を求めている? –

1

私だけ10001の後ろにタブを置くことによって、あなたのエラーを再現することができます。

10001⟶Emma  0486406482 

はタブ文字である)

あなたは、単一のスペースで分割され、その10001Emmaは2つの要素が、1つの配列要素ではありません、そして、もちろん、それは解析可能ではありません整数として。

これは1つ以上のwhitespace charactersで分割して修正できます。

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

ああ、といくつかのより多くの事:

  • Bookクラスのプロパティは、すべての「ブック」で始まるsplit()は、正規表現を受け入れているので、あなたは、単にこれを書くことができます。一般にクラス名を繰り返す必要はありません。したがってid,name,isbn,authorLastNameおよびcategoryは問題ありません。
  • 配列の代わりにListを使用できます。よりエレガントで、最初にサイズを宣言する必要はありません。また、bookArray.size()でサイズを取得できるので、bookCount変数はもう必要ありません。
  • Java 8では、関数型プログラミングを使用して本を検索できます。

    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!"); 
        } 
    } 
    
関連する問題