2016-10-11 5 views
-1

숙제를하고 있지만 문제가 발생했습니다. 내 코드는 txt 파일에서 책 (저자, 제목 등)에 대한 정보를 스캔 한 다음 인쇄합니다. 먼저 저자, 제목, ISBN 코드, 페이지 수, 그리고 15 * 페이지 수의 도서 가격을 인쇄하려고했습니다. 지금까지 작동하지만 각 책에 번호를 추가하려고 했으므로 목록과 같이 나타납니다. 그러나 코드를 수정하여 해당 숫자를 추가하면 코드에서 스캔하지 않으려 고합니다. 그것은Java - 하나의 parseInt는 오류를 표시하고 다른 하나는 오류를 표시하지 않습니다.

INT 내가 호기심 문자열로 숫자를 스캔하기 문자열

로 변환 할 수 없습니다 만, 다음 오류 메시지가

문자열로 변환 할 수 있다고 말한다 int로

내 예약 클래스 :

,536,913,632 10
public class Book { 
    private int number; 
    private String author; 
    private String title; 
    private String code; 
    private int pages; 
    private static int multiplier = 15; 

    public Book(String author, String title, String code, int pages, int number) { 
     this.number = number; 
     this.author = author; 
     this.title = title; 
     this.code = code; 
     this.pages = pages; 
    } 

    @Override 
    public String toString() { 
     return author + " - " + title + ", ISBN:" + code + ", " + pages + " pages, Price: " + price() + "Ft"; 
    } 

    public int price() { 
     return multiplier * pages; 
    } 

    public static int getMultiplier() { 
     return multiplier; 
    } 

    public static void setMultiplier(int multiplier) { 
     Book.multiplier = multiplier; 
    } 

    public int getNumber() { 
     return number; 
    } 


    public String getAuthor() { 
     return author; 
    } 

    public String getTitle() { 
     return title; 
    } 

    public String getCode() { 
     return code; 
    } 

    public int getPages() { 
     return pages; 
    } 

} 

그리고 내 "컨트롤러"클래스 :

public class Controller { 

void start() { 
    scanning(); 
    printing("Avilable books: ");   


} 

private List<Book> books = new ArrayList<>(); 


private void scanning() { 

    try { 
     Scanner fajlScanner = new Scanner(new File("books.txt")); 
     String row; 
     String data[]; 
     while (fajlScanner.hasNextLine()) { 

      row = fajlScanner.nextLine(); 
      data = row.split(";"); 
      //1;J.K. Rowling;Harry Potter and the Philosopher's Stone;1782637594826;342 
      //this line below gives the error for the data[0] 
      books.add(new Book(Integer.parseInt(data[0]), data[1], data[2], data[3], Integer.parseInt(data[4]))); 

     } 

    } catch (FileNotFoundException ex) { 
     Logger.getLogger(Controller.class.getName()).log(Level.SEVERE, null, ex); 
    } 

} 

private void printing(String title) { 
    System.out.println(title); 
    for (Book book : books) { 
     System.out.println(book); 

    } 
} 
} 

내 TXT의 내용 :

1;J.K. Rowling;Harry Potter and the Philosopher's Stone;1782637594826;342 
2;J.R.R. Tolkien;The Fellowship of the Ring;1827493762573;431 
3;Stephen King;Needful Things;8274653821647;411 
4;Eric Knight;Lassie Come-Home;7263845618293;138 
5;Molnár Ferenc;A pál utcai fiúk;9283746192846;194 
6;Winston Groom;Forrest Gump;0385231342;228 
7;Antoine de Saint-Exupéry;The Little Prince;8362748172649;69 
8;Stephen King;Cujo;2918467382914;362 

나는 페이지가 좋은 검색 할 수 있지만,이 "수"로 약간의 문제가 있습니다.

+0

public class Book { private static int counter=1; private int number; private String author; private String title; private String code; private int pages; private static int multiplier = 15; public Book(String author, String title, String code, int pages, int number) { this.number = counter; this.author = author; this.title = title; this.code = code; this.pages = pages; counter++; } 

행운? ** 파싱하기 전에 각 배열의 내용을 출력하여 자신을위한 변수를 테스트 해보십시오. 또는 디버거를 사용하십시오. –

+0

잘못된 순서로 인수를 전달하려고하는 것 같습니다. – user2357112

+1

디버깅을 쉽게하기 위해 각 구문 분석을 자체적 인 행에 두는 것을 고려하십시오. 파싱하기 전에 각 문자열을 출력하십시오.파싱하기 전에''trim()' '할 필요는 없는지 확인하십시오. –

답변

1

입력 내용은 다음과 같습니다. 1; J.K. 롤링, 해리 포터와 철학자의 돌, 1782637594826, 342

생성자는 다음과 같습니다 입력

public Book(String author, String title, String code, int pages, int number){ 
/*. 
. 
.*/ 
} 

첫 번째 문자는 정수하지만 생성자의 첫 번째 매개 변수가 String 인 "1"입니다. 그래서 오류가 나타납니다. "1"은 생성자에 따라 입력의 끝에 있어야합니다.

각 책의 숫자가하는 추가 static 변수를 사용하여 1로 초기화 설정, 당신은 싶어 할 때마다 책을 추가하기위한

++, 책의 수를 위해 정적 변수의 현재 값을 설정합니다. 어떻게 books.txt없이 도움을

+0

생성자를 다시 정렬하면 문제가 해결됩니다. 감사합니다. 그러나 코드를 실행하려면 다음과 같은 오류 메시지가 나타납니다. "스레드"main "에서 예외"java.lang.NumberFormatException : 입력 문자열 : "1" " 원인은 무엇입니까? – DewSee

+0

@DewSee 정수가 아닌 값을 정수 변수로 설정하려고하면이 오류가 나타납니다. 코드를주의 깊게 확인하면 찾을 수 있습니다. – HMD

+0

예, 문제가 여전히 'Integer.parseInt (data [0])'와 같습니다. 문자열로만 스캔하면 작동하지만 정수로 사용하는 것이 훨씬 더 우아하고 효율적입니다. 그래서 parseInt를 사용하는 것이지만 다른 문제가 있습니다. 알아낼 수 없습니다. 좀 더 실마리를 주시겠습니까? – DewSee

2

북 구성자에게 올바른 순서로 올바른 매개 변수를 제공하고 있는지 확인하십시오.

생성자 :

public Book(String author, String title, String code, int pages, int number) 

귀하의 객체 생성 :

new Book(Integer.parseInt(data[0]), data[1], data[2], data[3], Integer.parseInt(data[4])) 

가 오류를 발견 할 수 있습니까?

+0

나는 그랬다, 고마워. 이제는 실행하고 싶을 때 다음과 같은 오류가 발생합니다. "스레드"main "의 예외"java.lang.NumberFormatException : 입력 문자열 : "1" " – DewSee

+0

에 올바른 문자 세트를 지정하십시오. 스캐너. 스캐너 fajlScanner = 새 스캐너 (새 파일 ("books.txt"), "UTF-8"), ' UTF-8을 books.txt에 사용 된 인코딩으로 바꿉니다. – user41991