Serializacja XML "java.lang.NullPointerException"

0

Na zajęcia z Java to zło, próbuję zrealizować zadanie serializacji pliku XML ze złożonym elementem authors:

 <book id="100E27">
        <title>100 sposobów na Excel 2007 PL. Tworzenie funkcjonalnych arkuszy</title>
        <authors>
            <author>David Hawley</author>
            <author>Raina Hawley</author>
        </authors>
        <isbn>978-83-246-1331-1</isbn>
        <publisher>Helion</publisher>
        <year>2008</year>
        <pages>368</pages>
    </book>

Robiąc to tak:

main.java:

try {
			JAXBContext context = JAXBContext.newInstance(BookList.class);
			Unmarshaller um = context.createUnmarshaller();

			FileReader file = new FileReader("books.2.xml");
			BookList books = (BookList) um.unmarshal(file);

			file.close();

			BookManager bm = new BookManager(books.getBooks());
			List<String> new_book_authors = new ArrayList<>();
			new_book_authors.add("Michał");

		        Book ksiazka = new Book("1", "Laboratorium: Java i XML", new_book_authors, "111-222-333", 2018, 
                        "UCZELNIA WYDAWNICZA", 1);

		bm.addBook(ksiazka);

		List<Book> bs = bm.searchByTitle("Java");

		System.out.println(bs);
		BookList bls = new BookList();

		bls.setBooks(bs);

		System.out.println(bls);

		Marshaller m = context.createMarshaller();
		FileWriter fiW = new FileWriter("lab3.xml");

		m.marshal(bls, fiW);

		fiW.close();

	}
	catch (Exception ex) {
			ex.printStackTrace();
	}

konstruktor

 public Book(String id, String title, List<String> authors, String isbn, Integer year, String publisher, Integer pages) {
        this.id = id;
        this.title = title;
        this.authors.addAll(authors);
        this.isbn = isbn;
        this.year = year;
        this.publisher = publisher;
        this.pages = pages;
    }

otrzymuję wymowne błędy:

java.lang.NullPointerException
at books.Book.<init>(Book.java:25)
at books.Main.main(Main.java:65)

błędy są odpowiednio na liniach:

this.authors.addAll(authors);

		Book ksiazka = new Book("1", "Laboratorium: Java i XML", new_book_authors, "111-222-333", 2018, "UCZELNIA WYDAWNICZA", 1);

oczywiście używam wrapperaXML:

@XmlRootElement(name = "books")
class BookList {
	
	private List<Book> books;

	@XmlElementWrapper
	@XmlElement(name = "book")
	public List<Book> getBooks() {
		return books;
	}

Ktoś ma pomysł? ;) Wkrótce kolejne zajęcia a ja na tym utknąłem ;p

0

Pokaż pan ten wyjątek bo tak z powietrza to nie umiem.

0

Mam wyżej napisane:

java.lang.NullPointerException
at books.Book.<init>(Book.java:25)
at books.Main.main(Main.java:65)

0

Debugowałeś się przez to? (Book.java:25) to pewnie jakiś getter więc zobacz czy w ogóle jakieś pola są wypełniane. Użyj debuggera.

0

podawałem skąd to się bierze. w konstruktorze: " this.authors.addAll(authors);" to java:25

0

Sprawdź to:

        this.authors.addAll(authors);

Bo pewnie wyżej masz tylko:

List<String> authors;

i jak próbujesz tam dodać autorów to leci NPE.

0

No mam tak i co mam z tym zrobić?

jak dam:

 List<String> authors=new ArrayList<>();

to zmienia się umiejscowienie błędów..

0

Jeśli masz:

List<String> authors;

a potem wołasz na tym:

this.authors.addAll(authors);

to na pewno będziesz miał NPE bo próbujesz dodać elementy do kolekcji która jest null'em.

Popraw i pokażd jaki masz błąd.

0

dałem:

    List<String> authors=new ArrayList<>();

i teraz jest:

java.lang.NullPointerException
	at books.BookManager.addBook(BookManager.java:47)




**KOD:**

public Book addBook(Book b) {
		if (b.getTitle().isEmpty() || b.getAuthors().isEmpty()) {
			throw new RuntimeException("nie ma tytułu");
		} else {
			books.add(b);
		}
		return b;
	}
0

Jak i gdzie tworzysz tę listę books?

0

w MAIN:

		Book ksiazka = new Book("1", "Laboratorium: Java i XML", new_book_authors, "111-222-333", 2018, "UCZELNIA WYDAWNICZA", 1);

0

private List<Book> books;

0
youmound napisał(a):

w MAIN:

		Book ksiazka = new Book("1", "Laboratorium: Java i XML", new_book_authors, "111-222-333", 2018, "UCZELNIA WYDAWNICZA", 1);

Tak tworzysz książkę a wyjątek leci Ci na zmiennej books ( books.add(b);). Pewnie masz podobnie jak we wcześniejszym przypadku.

0

Polecam stronę:
http://krzysztofjelonek.net/mapowanie-xml-obiektow-java-jaxb/

Pozdrawiam Tomasz J

1 użytkowników online, w tym zalogowanych: 0, gości: 1