Serializacja XML "java.lang.NullPointerException"

Serializacja XML "java.lang.NullPointerException"
YO
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 540
0

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

Kopiuj
 <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:

Kopiuj
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

Kopiuj
 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:

Kopiuj
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:

Kopiuj
@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

EL
  • Rejestracja: dni
  • Ostatnio: dni
0

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

YO
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 540
0

Mam wyżej napisane:

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

EL
  • Rejestracja: dni
  • Ostatnio: dni
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.

YO
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 540
0

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

EL
  • Rejestracja: dni
  • Ostatnio: dni
0

Sprawdź to:

Kopiuj
        this.authors.addAll(authors);

Bo pewnie wyżej masz tylko:

Kopiuj
List<String> authors;

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

YO
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 540
0

No mam tak i co mam z tym zrobić?

jak dam:

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

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

EL
  • Rejestracja: dni
  • Ostatnio: dni
0

Jeśli masz:

Kopiuj
List<String> authors;

a potem wołasz na tym:

Kopiuj
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.

YO
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 540
0

dałem:

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

i teraz jest:

Kopiuj
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;
	}
EL
  • Rejestracja: dni
  • Ostatnio: dni
0

Jak i gdzie tworzysz tę listę books?

YO
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 540
0

w MAIN:

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

L2
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10
0

private List<Book> books;

EL
  • Rejestracja: dni
  • Ostatnio: dni
0
youmound napisał(a):

w MAIN:

Kopiuj
		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.

  • Rejestracja: dni
  • Ostatnio: dni
0

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

Pozdrawiam Tomasz J

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.