Java — один синтаксический анализ показывает ошибку, другой — нет

#java #arraylist #parseint

#java #arraylist #синтаксический анализ

Вопрос:

Я делал свою домашнюю работу, но столкнулся с проблемой. Мой код сканирует некоторую информацию о книгах (автор, название и т.д.) Из текстового файла, а затем печатает ее. Сначала я попытался напечатать автора, название, код ISBN, количество страниц, затем цену книг, которая равна 15 * количество страниц. Это работает до сих пор, однако я хотел добавить номер для каждой книги, чтобы она выглядела как список. Но когда я изменил код, чтобы добавить эти числа, код не захотел их сканировать. в нем говорится

int не может быть преобразован в String

Я попытался отсканировать числа в виде строк из любопытства, но затем в сообщении об ошибке говорилось, что

Строка не может быть преобразована в int

Мой класс Book:

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

}
  

И мой класс «Controller»:

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

    }
}
}
  

Содержимое моего текстового:

 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
  

Я могу хорошо сканировать страницы, но у него есть некоторые проблемы с «номером».

Комментарии:

1. Как помочь без books.txt ? Почему бы не распечатать содержимое каждого массива перед синтаксическим анализом, чтобы проверить переменные для себя? Или используйте отладчик.

2. Похоже, вы пытаетесь передать аргументы в неправильном порядке.

3. Подумайте о том, чтобы поместить каждый синтаксический анализ в отдельную строку — чтобы упростить отладку. Распечатайте каждую строку перед ее анализом. Убедитесь, что строки не нужно trim() редактировать перед синтаксическим анализом.

Ответ №1:

Убедитесь, что вы задаете правильные параметры в правильном порядке своему Book-конструктору.

Конструктор:

 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]))
  

Можете ли вы обнаружить ошибку?

Комментарии:

1. Я сделал, спасибо. Теперь все в порядке, однако, когда я хочу его запустить, я получаю сообщение об ошибке: «Исключение в потоке «main» java.lang.NumberFormatException: для входной строки: «1»»

2. Попробуйте указать правильную кодировку для сканера. Scanner fajlScanner = new Scanner(new File("books.txt"), "UTF-8"); Замените UTF-8 кодировкой, используемой на books.txt .

Ответ №2:

ваш ввод: 1; Джоан Роулинг; Гарри Поттер и Философский камень; 1782637594826;342

ваш конструктор:

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

первый символ ввода — «1», который является целым числом, но в вашем конструкторе первым параметром является a String . вот почему появилась ошибка. «1» должно быть в конце ввода в соответствии с конструктором.

чтобы задать номер для каждой книги, используйте дополнительную static переменную, инициализируйте ее равным 1, каждый раз, когда вы хотите добавить книгу, установите текущее значение статической переменной для номера книги, а затем ее.

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

Удачи

Комментарии:

1. Переупорядочение конструктора решило проблему, спасибо! Однако, когда я хочу запустить код, я получаю сообщение об ошибке: «Исключение в потоке «main» java.lang.NumberFormatException: для входной строки: «1»» Вы знаете, что может вызвать это?

2. @DewSee эта ошибка появилась, когда вы пытаетесь установить нецелочисленное значение для целочисленной переменной. внимательно проверьте свой код, вы его найдете.

3. Да, как я видел, проблема по-прежнему связана с Integer.parseInt(data[0]) . Когда я сканирую его только как строку, он работает, но было бы намного элегантнее и эффективнее использовать их как целые числа. Вот почему я использовал parseInt, но проблема в чем-то другом, я просто не могу понять это. Не могли бы вы дать мне еще несколько подсказок?

4. @DewSee посмотрите на сообщение об ошибке: For input string: "1"" . в нем говорится, что вы пытаетесь сохранить 1" в целочисленной переменной. проверьте входные данные, кажется, что проблема во входных данных. у меня должен быть весь ваш код, чтобы выяснить, в чем именно проблема.

5. На самом деле проблема заключалась в том, что в текстовом файле перед «1» была невидимая точка, поэтому он не смог ее отсканировать. Насколько я знаю, это потому, что это своего рода метка для кодирования UTF-8. Но в любом случае, спасибо за вашу помощь!