Hỏi về lỗi "Exception in thread "main" java.lang.NullPointerException"

e có 2 class

package controller;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Scanner;
import model.Book;
import model.BookReaderManagerment;
import model.Reader;

public class DataController {
    private FileWriter fileWriter;//mo file
    private BufferedWriter bufferedWriter;//tao bo dem cho chuoi trong file
    private PrintWriter printWriter;//ghi file
    private Scanner scanner;//doc file

//open file
    public void openFileToWriter(String fileName){
        try {
            fileWriter = new FileWriter(fileName, true);
            bufferedWriter = new BufferedWriter(fileWriter);
            printWriter = new PrintWriter(bufferedWriter);
        } catch (IOException e){
            e.printStackTrace();
        }
    }

//write file book
   public void writeBookToFile(Book book, String fileName){
        openFileToWriter(fileName); //mo file
        printWriter.println(book.getBookID()+"-"+book.getBookName()+"-"+book.getAuthor()+"-"+book.getSpecialization()
                +"-"+book.getPublishYear()+"-"+book.getQuantity()); //ghi file book
        closeBookAfterWrite(fileName); //dong file
   }

//writer file reader
    public void   witeReaderToFile(Reader reader, String fileName){
        openFileToWriter(fileName); //mo file
        printWriter.println(reader.getReaderID()+"-"+reader.getFullName()+"-"+reader.getAddress()+"-"+reader.getPhoneNumber()); //ghi file reader
        closeBookAfterWrite(fileName); //dong file
    }

//writer file BRM
    void   witeBRMToFile(BookReaderManagerment brm, String fileName){
        openFileToWriter(fileName); //mo file
        printWriter.println(brm.getReader().getReaderID()+"-"+brm.getBook().getBookID()+"-"+brm.getNumOfBorrow()+"-"+brm.getState()); //ghi file brm
        closeBookAfterWrite(fileName); //dong file
    }

//close file
    void   closeBookAfterWrite(String fileName){
        try {
            printWriter.close();
            bufferedWriter.close();
            fileWriter.close();
        } catch (IOException e){
            e.printStackTrace();
        }
    }


}

package view;

import model.Book;
import controller.DataController;

import java.sql.SQLOutput;
import java.util.ArrayList;
import java.util.Scanner;


public class View {
    public static void main(String[] args) {
        int choice = 0; //biến chọn
        String booksFileName = "BOOK.txt"; //tên file lưu sách
        DataController controller = new DataController(); //tạo đối tượng để truy cập DataController
        Book books = null; //danh sách các sách

        Scanner scanner; //tạo đối tượng để nhập
        scanner = new Scanner(System.in);

        // menu
        do {
            System.out.println("____________MENU____________");
            System.out.println("1. Thêm một đầu sách vào file");
            System.out.println("2. Hiển thị danh sách các sách có trong file");
            System.out.println("0. Thoát khỏi ứng dụng");
            System.out.println("Bạn chọn ?");

            choice = scanner.nextInt();//chọn menu 1 hay 2 hay 0
            scanner.nextLine();//đọc bỏ dòng chứa lựa chọn
            switch (choice) {
                case 0: //nếu chọn 0
                    System.out.println("Cảm ơn bạn đã sử dụng ứng dụng của tôi");
                    break; //thoát ứng dụng
                case 1:
                    String[] specs = {"Science", "Art", "Econonic", "It"}; //tạo danh sách phân loại: Khoa học, nghệ thuật, kinh tế, công nghệ thông tin
                    String bookName, author, spec;
                    int year, quan, sp; //sp = biến phân loại

                    System.out.println("Nhập tên sách: ");
                    bookName = scanner.nextLine();

                    System.out.println("Nhập tên tác giả");
                    author = scanner.nextLine();

                    do {
                        System.out.println("Nhập thể loại sách");
                        System.out.println("1. Science. \n2. Art. \n3. Econonic. \n4. It.");
                        sp = scanner.nextInt();
                    } while (sp < 1 || sp > 4);
                    spec = specs[sp - 1]; //lấy giá trị trong mảng phân loại gán cho biến spec = thể loại


                    System.out.println("Nhập năm xuất bản");
                    year = scanner.nextInt();

                    System.out.println("nhập số lượng: ");
                    quan = scanner.nextInt();


                    Book book = new Book(0, bookName, author, spec, year, quan);
                    controller.writeBookToFile(books, booksFileName);
                    break;
            }
        }while (choice != 0);

    }
}

khi e build class view thì nó xuất hiện cho e nhập thông tin như sau:

____________MENU____________
1. Thêm một đầu sách vào file
2. Hiển thị danh sách các sách có trong file
0. Thoát khỏi ứng dụng
Bạn chọn ?
1
Nhập tên sách: 
dád
Nhập tên tác giả
sdasd
Nhập thể loại sách
1. Science. 
2. Art. 
3. Econonic. 
4. It.
1
Nhập năm xuất bản
2665
nhập số lượng: 
2

sau khi nhập xong thì đến công đoạn ghi file nó báo lỗi:

Exception in thread "main" java.lang.NullPointerException
	at controller.DataController.writeBookToFile(DataController.java:32)
	at view.View.main(View.java:62)

mọi người chỉ e xử lý lỗi này với. e cảm ơn!

Khả năng rất cao là “book” trong method “writeBookToFile” đang là null:

                    Book book = new Book(0, bookName, author, spec, year, quan);
                    controller.writeBookToFile(books, booksFileName);

Bạn mới khởi tạo book chứ books vẫn là null mà lại được truyền vào method.

8 Likes

đúng rồi bạn. cảm ơn nhiều!

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?