Dynamiczne tworzenie obiektów klasowych w konstruktorze

0

Witam.
Mam pewien problem z wyjątkiem NullPointerException.
Oto kod:

public Aukcja(Sprzedawca u1, String nazwa, String opis, Double cena,
			String dataKonca){
		s1 = u1;
		this.nazwa = nazwa;
		this.opis = opis;
		this.cena = cena;
		this.dataDodania = wyswietlDate();
		this.dataKonca = dataKonca;
		dodajAukcje(this);
	}

Na początku kodu mam to:

Sprzedawca s1 = new Sprzedawca();

I wyświetla mi NullPointerException. Rozumiem, że chodzi o to, że tworzy się na początku pusty obiekt? Jak zniwelować problem?

0

Ale GDZIE leci ten nullpointer?! Przecież nie programujesz lodówką. IDE pokazuje ci KONKRETNĄ LINIĘ W KODZIE gdzie wystąpił bląd. Serio.
Pokaż więcej kodu...

0
package MAS01;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.Serializable;
import java.util.Vector;

public class Sprzedawca extends Osoba{
	private boolean pelnoletni;
	private String adres;
	private long nr_telefonu;
	// Atrybut Opcjonalny
	private String nick;

	public Sprzedawca() {
		dodajSprzedawce(this);
	}

	public Sprzedawca(String imie, String nazwisko, String email,
			boolean pelnoletni, String adres, long nr_telefonu, String nick) {
		super(imie, nazwisko, email);
		//new Osoba();
		this.pelnoletni = pelnoletni;
		this.adres = adres;
		this.nr_telefonu = nr_telefonu;
		this.nick = nick;
		dodajSprzedawce(this);
	}

	public Sprzedawca(String imie, String nazwisko, String email,
			boolean pelnoletni, String adres, long nr_telefonu) {
		super(imie, nazwisko, email);
		this.pelnoletni = pelnoletni;
		this.adres = adres;
		this.nr_telefonu = nr_telefonu;
		dodajSprzedawce(this);
	}

	public String zmienAdres(String adres) {
		this.adres = adres;
		return adres;
	}

	public long zmienNrTelefonu(long nr_telefonu) {
		this.nr_telefonu = nr_telefonu;
		return nr_telefonu;
	}

	public String toString() {
		return super.toString() + "\nPełnoletni: " + pelnoletni + "\nAdres: "
				+ adres + "\nNr. telefonu: " + nr_telefonu;
	}

	// Implementacja ekstensji
	/** Ekstensja. */
	private static Vector<Sprzedawca> ekstensja = new Vector<Sprzedawca>();

	static void dodajSprzedawce(Sprzedawca u) {
		ekstensja.add(u);
	}

	static void usunSprzedawce(Sprzedawca u) {
		ekstensja.remove(u);
	}

	/** Trwałość ekstensji. */
	private void write(DataOutputStream stream) throws IOException {
		stream.writeUTF(getImie());
		stream.writeUTF(getNazwisko());
		stream.writeUTF(getEmail());
	}

	private void read(DataInputStream stream) throws IOException {
		setImie(stream.readUTF());
		setNazwisko(stream.readUTF());
		setEmail(stream.readUTF());
	}

	public static void zapiszEkstensje(DataOutputStream stream)
			throws IOException {
		stream.writeInt(ekstensja.size());
		for (Sprzedawca u : ekstensja) {
			u.write(stream);
		}
	}

	public static void pokazEkstensje() {
		System.out.println("Ekstensja klasy Uzytkownik: ");
		for (Sprzedawca u : ekstensja) {
			System.out.println(u);
		}
	}

	public static void odczytajEkstensje(DataInputStream stream)
			throws IOException {
		Sprzedawca u = null;
		int liczbaObiektow = stream.readInt();
		ekstensja.clear();
		for (int i = 0; i < liczbaObiektow; i++) {
			u = new Sprzedawca();
			u.read(stream);
		}
	}
}

NullPointerExeption wyskakuje tutaj:

stream.writeUTF(getImie());
u.write(stream);

getImie() jest to zwykły return z nadklasy Osoba

0

Oznacza to że twoja metoda getImie zwróciła nulla. Weźże nie rób z siebie ofiary, kliknij breakpoint w tym miejscu, odpal debuger i zobacz co się dzieje.

0

Nie robię z siebie ofiary, tylko się pytam. To, że jesteś taką ogarniętą osobą z javy to nie znaczy, że ja jestem. Ok zwraca getImie() nulla, ale co niby można z tym zrobić jak deklaracje obiektów mam w klasie Main.

1

Słabo mi. Skoro zwraca nulla to znaczy że pewnie przekazałeś do konstruktora obiektu nulla, albo zapomniałeś w konstruktorze przypisać wartości do tego pola. Tak przynajmniej mówi moja szklana kula, bo póki co pokazałeś kupę kodu niezwiązanego nijak z problemem...

0

Osoba

package MAS01;

import java.io.Serializable;
import java.util.Vector;

public class Osoba {
	private String imie, nazwisko, email;
	private int id = 0;

	// private static int Incr = 0;

	public Osoba() {
		dodajOsobe(this);
	}

	public Osoba(String im, String nazw, String em) {
		setImie(im);
		setNazwisko(nazw);
		setEmail(em);
		dodajOsobe(this);
	}

	public String toString() {
		return "\nImię: " + getImie() + "\nNazwisko: " + getNazwisko()
				+ "\nemail: " + getEmail();
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getImie(){
		return imie;
	}

	public void setImie(String imie) {
		this.imie = imie;
	}

	public String getNazwisko() {
		return nazwisko;
	}

	public void setNazwisko(String nazwisko) {
		this.nazwisko = nazwisko;
	}

	public String getEmail() {
		return email;
	}
	// Implementacja ekstensji
	/** Ekstensja. */
	private static Vector<Osoba> ekstensja = new Vector<Osoba>();

	private static void dodajOsobe(Osoba os) {
		ekstensja.add(os);
	}

	private static void usunOsobe(Osoba os) {
		ekstensja.remove(os);
	}

	public static void pokazEkstensje() {
		System.out.println("Ekstensja klasy Osoba: ");
		for (Osoba os : ekstensja) {
			System.out.println(os);
		}
	}
}

Main:

package MAS01;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Vector;

public class Main {

	public static void main(String[] args) {

		final String ekstensjaPlik = "d:\\Ekstensja.bin";
		Vector<Aukcja> kategorie = new Vector<Aukcja>();
		Sprzedawca u1 = new Sprzedawca("Tomasz", "Ojrzynski", "[email protected]",
				true, "Koszykowa 86", 678535687);
		Sprzedawca u2 = new Sprzedawca("Grzegorz", "Kowalski", "[email protected]",
						false, "Sernacka 21", 579320148);
		
		Aukcja a1 = new Aukcja(u1, "Golarka LG", "Super tania", 97.00, "14.05.2016");
		Aukcja a2 = new Aukcja(u2, "Szafa przenośna", "Nie używana", 354.00, "22.05.2016");
		//System.out.println(a1.daysBetween(, "22.05.2016"));
		u1.zmienAdres("Lipowa 12");
		u1.zmienNrTelefonu(657345837);
		
		try {
			 //Zapisz ekstensje do strumienia
			DataOutputStream out2 = new DataOutputStream(
					new BufferedOutputStream(
							new FileOutputStream(ekstensjaPlik)));
			Sprzedawca.zapiszEkstensje(out2);
			Aukcja.zapiszEkstensje(out2);
			out2.close();
			// Odczytaj ekstensje ze strumienia
			DataInputStream in2 = new DataInputStream(new BufferedInputStream(
					new FileInputStream(ekstensjaPlik)));
			Sprzedawca.odczytajEkstensje(in2);
			Aukcja.odczytajEkstensje(in2);
			in2.close();
		} catch (Exception exc) {
			exc.printStackTrace();
		}
		//dodajSprzedawce(u1);
		//System.out.println(u1);
		Sprzedawca.pokazEkstensje();
		Aukcja.pokazEkstensje();
		
		Aukcja.wyswietlDate();
	}
}
0

Ok. Abstrahuje chwilowo od tego że ten kod nie ma totalnie sensu i na 99% nie zrozumiałeś polecenia...
Kod który podałeś działa. Więc może jednak łaskawie pokażesz prawdziwy kod którego używasz? o_O
Tak wygląda skrócony kod który działa:

package com.company;


import java.io.*;
import java.util.Vector;

class Osoba {
    private String imie, nazwisko, email;

    public Osoba() {
        dodajOsobe(this);
    }

    public Osoba(String im, String nazw, String em) {
        setImie(im);
        setNazwisko(nazw);
        setEmail(em);
        dodajOsobe(this);
    }

    public String toString() {
        return "\nImię: " + getImie() + "\nNazwisko: " + getNazwisko()
                + "\nemail: " + getEmail();
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getImie(){
        return imie;
    }

    public void setImie(String imie) {
        this.imie = imie;
    }

    public String getNazwisko() {
        return nazwisko;
    }

    public void setNazwisko(String nazwisko) {
        this.nazwisko = nazwisko;
    }

    public String getEmail() {
        return email;
    }

    private static Vector<Osoba> ekstensja = new Vector<Osoba>();

    private static void dodajOsobe(Osoba os) {
        ekstensja.add(os);
    }

    private static void usunOsobe(Osoba os) {
        ekstensja.remove(os);
    }

    public static void pokazEkstensje() {
        System.out.println("Ekstensja klasy Osoba: ");
        for (Osoba os : ekstensja) {
            System.out.println(os);
        }
    }
}


class Sprzedawca extends Osoba{
    private boolean pelnoletni;
    private String adres;
    private long nr_telefonu;
    private String nick;

    public Sprzedawca() {
        dodajSprzedawce(this);
    }

    public Sprzedawca(String imie, String nazwisko, String email,
                      boolean pelnoletni, String adres, long nr_telefonu, String nick) {
        super(imie, nazwisko, email);
        this.pelnoletni = pelnoletni;
        this.adres = adres;
        this.nr_telefonu = nr_telefonu;
        this.nick = nick;
        dodajSprzedawce(this);
    }

    public Sprzedawca(String imie, String nazwisko, String email,
                      boolean pelnoletni, String adres, long nr_telefonu) {
        super(imie, nazwisko, email);
        this.pelnoletni = pelnoletni;
        this.adres = adres;
        this.nr_telefonu = nr_telefonu;
        dodajSprzedawce(this);
    }

    public String zmienAdres(String adres) {
        this.adres = adres;
        return adres;
    }

    public long zmienNrTelefonu(long nr_telefonu) {
        this.nr_telefonu = nr_telefonu;
        return nr_telefonu;
    }

    public String toString() {
        return super.toString() + "\nPełnoletni: " + pelnoletni + "\nAdres: "
                + adres + "\nNr. telefonu: " + nr_telefonu;
    }

    private static Vector<Sprzedawca> ekstensja = new Vector<Sprzedawca>();

    static void dodajSprzedawce(Sprzedawca u) {
        ekstensja.add(u);
    }

    static void usunSprzedawce(Sprzedawca u) {
        ekstensja.remove(u);
    }

    private void write(DataOutputStream stream) throws IOException {
        stream.writeUTF(getImie());
        stream.writeUTF(getNazwisko());
        stream.writeUTF(getEmail());
    }

    private void read(DataInputStream stream) throws IOException {
        setImie(stream.readUTF());
        setNazwisko(stream.readUTF());
        setEmail(stream.readUTF());
    }

    public static void zapiszEkstensje(DataOutputStream stream)
            throws IOException {
        stream.writeInt(ekstensja.size());
        for (Sprzedawca u : ekstensja) {
            u.write(stream);
        }
    }

    public static void pokazEkstensje() {
        System.out.println("Ekstensja klasy Uzytkownik: ");
        for (Sprzedawca u : ekstensja) {
            System.out.println(u);
        }
    }

    public static void odczytajEkstensje(DataInputStream stream)
            throws IOException {
        Sprzedawca u = null;
        int liczbaObiektow = stream.readInt();
        ekstensja.clear();
        for (int i = 0; i < liczbaObiektow; i++) {
            u = new Sprzedawca();
            u.read(stream);
        }
    }
}

public class Test6 {
    public static void main(String[] args) {

        final String ekstensjaPlik = "d:\\Ekstensja.bin";
        Sprzedawca u1 = new Sprzedawca("Tomasz", "Ojrzynski", "[email protected]",
                true, "Koszykowa 86", 678535687);
        Sprzedawca u2 = new Sprzedawca("Grzegorz", "Kowalski", "[email protected]",
                false, "Sernacka 21", 579320148);

        u1.zmienAdres("Lipowa 12");
        u1.zmienNrTelefonu(657345837);
        try {
            DataOutputStream out2 = new DataOutputStream(
                    new BufferedOutputStream(
                            new FileOutputStream(ekstensjaPlik)));
            Sprzedawca.zapiszEkstensje(out2);
        } catch (Exception exc) {
            exc.printStackTrace();
        }
    }
}

Magia?

0

Jeszcze jest klasa Aukcja. Pokazuje Ci to co mam, nic nie zmieniam.

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Vector;
import java.util.concurrent.TimeUnit;



public class Aukcja {
	// Atrybut prosty
	private String nazwa, opis;
	private double cena;
	// atrybut złożony
	private static String dataDodania;
	private static String dataKonca;
	private int id;
	Sprzedawca s1 = new Sprzedawca();
	// atrybut powtarzalny
	private static Vector<Aukcja> kategorie = new Vector<Aukcja>();
	final static String formatDaty = "dd.MM.yyyy";
	private final static SimpleDateFormat dateFormatter = new SimpleDateFormat(
			formatDaty);

	// Konstruktor bezparametrowy
	public Aukcja() {
		dodajAukcje(this);
	}

	// Konstruktor z parametrami
	public Aukcja(Sprzedawca u1, String nazwa, String opis, Double cena,
			String dataKonca) {
		this.nazwa = nazwa;
		this.opis = opis;
		this.cena = cena;
		this.dataDodania = wyswietlDate();
		this.dataKonca = dataKonca;
		dodajAukcje(this);
	}

	// Zwraca obecną datę
	public static String wyswietlDate() {
		DateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy");
		// get current date time with Date()
		Date date = new Date();
		String d = dateFormat.format(date).toString();
		return d;
	}

	// Metoda pochodna - ile dni trwa aukcja
	public static long daysBetween(String s1, String s2) {
		long days = 0;
		try {
			Date date1 = dateFormatter.parse(s1);
			Date date2 = dateFormatter.parse(s2);
			long diff = date2.getTime() - date1.getTime();
			days = TimeUnit.DAYS.convert(diff, TimeUnit.MILLISECONDS);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return days;
	}

	public static String getDataDodania() {
		return dataDodania;

	}

	public static String getDataKonca() {
		return dataKonca;

	}

	// Implementacja ekstensji
	/** Ekstensja. */
	private static Vector<Aukcja> ekstensja = new Vector<Aukcja>();

	static void dodajAukcje(Aukcja a) {
		ekstensja.add(a);
	}

	static void usunAukcje(Aukcja a) {
		ekstensja.remove(a);
	}

	void dodajKategorie(Vector<Aukcja> kategoria) {
		kategorie.addAll(kategoria);
	}

	public String toString() {
		return "\nSprzedawca: " + s1.getImie() + " " + s1.getNazwisko()
				+ "\nNazwa: " + nazwa + "\nOpis: " + opis + "\nCena: " + cena
				+ "\nData Dodania: " + dataDodania;
	}

	/** Trwałość ekstensji. */
	@SuppressWarnings("deprecation")
	private void write(DataOutputStream stream) throws IOException {
		stream.writeInt(id);
		stream.writeUTF(nazwa);
		stream.writeUTF(opis);
		stream.writeDouble(cena);
		stream.writeUTF(dataDodania);
		stream.writeUTF(dataKonca);
	}

	private void read(DataInputStream stream) throws IOException {
		id = stream.readInt();
		nazwa = stream.readUTF();
		opis = stream.readUTF();
		cena = stream.readDouble();
		dataDodania = stream.readUTF();
		dataKonca = stream.readUTF();

	}

	public static void zapiszEkstensje(DataOutputStream stream)
			throws IOException {
		stream.writeInt(ekstensja.size());
		for (Aukcja a : ekstensja) {
			a.write(stream);
		}
	}

	public static void odczytajEkstensje(DataInputStream stream)
			throws IOException {
		Aukcja a = null;
		int liczbaObiektow = stream.readInt();
		ekstensja.clear();
		for (int i = 0; i < liczbaObiektow; i++) {
			a = new Aukcja();
			a.read(stream);
		}
	}

	public static void pokazEkstensje() {
		System.out.println("Ekstensja klasy Aukcja: ");
		for (Aukcja a : ekstensja) {
			System.out.println(a);
		}
	}
}
0

No ty sobie teraz chyba robisz jaja.

public class Aukcja {
//
Sprzedawca s1 = new Sprzedawca();
//
}

A pytasz się czemu masz sprzedawcę z pustym imieniem i nazwiskiem. Słabo mi. Ciekawe też po co w ogóle przekazujesz do aukcji sprzedawcę jako parametr skoro NIGDY z niego nie korzystasz. Geniusz.

Ciekawe też jaką lodówką programujesz, bo mój toster od razu wyświetlił mi informacje że nie korzystasz w konstruktorze z parametru Sprzedawca u1

A ten konstruktor bez parametrów w Sprzedawcy to pewnie dodałeś tylko dlatego że się nie chciało kompilować. Założe sie że tak było...

0

To niby jak mam przypisać sprzedawce do aukcji bez deklaracji? Sam już nie wiem.

0

A widzisz różnice między deklaracją pola a przypisaniem wartości? o_O

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