readObject i metoda instanceof

readObject i metoda instanceof
M9
  • Rejestracja:ponad 8 lat
  • Ostatnio:ponad 6 lat
  • Postów:140
0

Witam miałem napisać program do zarządzania pracownikami. Napisałem bez problemu, zapis i odczyt odbywał się z i do pliku txt przez BufferedReader i BufferedWriter. Teraz prowadzący zażyczył sobie zrobienie odczytu za pomocą Serializable o ile nie mam problemu z zapisem i odczytem (bezpośrednim do danego typu) to nie mogę sobie poradzić z polimorfizmem mam klasę abstrakcyjną Pracownik i rozszerzam ją o klasy Administracyjny oraz Dydaktyczny wszystkie dane muszę przechowywać w tablicach oprócz wyniku wyszukiwania. Gdy próbuję to skompilować to dostaję taki błąd
Exception in thread "main" java.lang.NullPointerException at Operacje.wypiszWszystkich(Operacje.java:125) at Test.main(Test.java:76) podejrzewam że tablica jest pusta bo nie działa odczyt, moglibyście mi pomóc jak go wykonać

Kopiuj
 import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;

public class Operacje implements Serializable{
	
	ArrayList <Pracownik> result=new ArrayList<Pracownik>();
	public Pracownik workers[];
	private int amount;
	public Operacje(){
		int amount=0;
		byte a=0;
		try{
			ObjectInputStream s=new ObjectInputStream(new FileInputStream("Database.ur"));
			amount=s.readInt();
			this.amount=amount;
			workers=new Pracownik[amount];
			Object worker=null;
			for (int i=0;i<amount;i++){
				worker=s.readObject();
				if(worker instanceof Admnistracyjny){
				workers[i]=new Admnistracyjny("","",a,"",0,"");
				workers[i]=(Admnistracyjny)worker;
				
				}
			if(worker instanceof Dydaktyczny){
				workers[i]=new Dydaktyczny("","",a,"",0,"");
				workers[i]=(Dydaktyczny)worker;
				}
			}
			
			s.close();
			
		}catch(Exception e){
			
		}	
	}
		
	
	public  void Search (String type,String value){
		result.clear();
		if (type.equals("zarobki")){
			int ernings=new Integer(value);
			for (int i=0;i<workers.length;i++){
				if(workers[i].getEarnings()==ernings){
					result.add(workers[i]);
				}
			}
		}
		
		else if (type.equals("nazwisko")){
			for (int i=0;i<workers.length;i++){
				if(workers[i].getSurname().equals(value)){
					result.add(workers[i]);
				}
			}
		}
		
		else if(type.equals("pesel")){
			for (int i=0;i<workers.length;i++){
				if(workers[i].getPesel().equals(value)){
					result.add(workers[i]);
				}
			}
		}
		
		else if (type.equals("stanowisko")){
			for (int i=0;i<workers.length;i++){
				if(((workers[i] instanceof Admnistracyjny) && (((Admnistracyjny)workers[i])).getPost().equals(value))){
					result.add(workers[i]);
				}
		}
		}
		
		else if (type.equals("przedmiot")){
			for (int i=0;i<workers.length;i++){
				if(((workers[i] instanceof Dydaktyczny) && (((Dydaktyczny)workers[i])).getSubject().equals(value))){
					result.add(workers[i]);
				}
		}
		}
	}
	
	
	public void SaveFile(Pracownik tab1[]) throws FileNotFoundException{
		try{
			ObjectOutputStream save=new ObjectOutputStream(new FileOutputStream("Database.ur"));
			int suma=((tab1.length+workers.length));
			save.writeInt(suma);
			for (int i=0;i<suma;i++){
				if (i<workers.length){
					save.writeObject(workers[i]);
				}
				else{
					save.writeObject(tab1[i-workers.length]);
				}
			}
			save.close();
		}
		catch(Exception e){
			
		}


		System.out.println("Zapisano");
	}
	
	
	public void Output(){
		if(result.isEmpty()){
			System.out.println("Brak pracowników o danych parametrach");
		}
		else{
			for(Pracownik p:result){
				System.out.println(p.toString());
			}
		}
	}
	public void wypiszWszystkich(){
		for (int i=0;i<amount;i++){
			System.out.println(workers[i].toString());
		}
	}
}

jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około godziny
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4707
1
Masterpc96 napisał(a):

Najprościej to przy zapisywaniu i odczytywaniu z pliku nie baw sie w jakies instanceof i zapisywanie ilości - tylko zapisz całą tablicę jednym strzałem:

Kopiuj
public Pracownik workers[];

..//
save.writeObject(workers);
//

Odczyt analogicznie:

Kopiuj
workers=( Pracownik[]) s.readObject();

jeden i pół terabajta powinno wystarczyć każdemu
M9
  • Rejestracja:ponad 8 lat
  • Ostatnio:ponad 6 lat
  • Postów:140
0

a powiedz mi zapis jak się odbywa w tym Serializable tak jak w txt otwiera mi plik i go czyści i wpisuje na nowo?

bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
0

Skąd Twoje przekonanie, że "czyści i wpisuje na nowo"? To zależy jak utworzysz FileWriter czy te FileOutputStream. Możesz otworzyć do dopisywania: https://docs.oracle.com/javase/8/docs/api/java/io/FileOutputStream.html


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
M9
  • Rejestracja:ponad 8 lat
  • Ostatnio:ponad 6 lat
  • Postów:140
0

czyli działanie takie samo jak w zapise np. PrintWriter domyślnie otwiera i czyści ale jak ustawię na dopisywanie to początek zostawi i kursor ustawi na końcu?

edytowany 1x, ostatnio: Masterpc96
KR
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 8 lat
  • Postów:10
1

Hej,

Klasa Operacje nie musi być Serializable. Nie wiadomo po co jest. Pracownik musi być.

Wtedy saveFile tak jak Jarek napisał, jak chcesz pojedynczo zapisywać to też możesz: w pętli i dla każdego obiektu typu Pracownik wykonujesz writeObject.
Za każdym razem plik jest nadpisywany (czyszczony). W ogóle jakąś dziwną logikę masz w tym saveFile. Niepotrzebna.

Nie musisz zapisywać amount - jak wczytasz wszystkie to będziesz wiedzieć ile masz.

Nie rób catch(Exception e), tylko rzucaj dalej.
Nazwy metod zaczynamy małą literą.

Jak chcesz robić nadpisywanie pliku to użyj FileOutputstream(String filename, boolean append).

Ale najpierw przetestuje czy działa z wymazywaniem pliku, a potem kombinuj z dopisywaniem (jezeli jest to w ogóle konieczne).

I używaj debuggera, będziesz wiedzieć co się dzieje i dlaczego.

/pozdr

M9
  • Rejestracja:ponad 8 lat
  • Ostatnio:ponad 6 lat
  • Postów:140
0
krgr napisał(a):

Jak chcesz robić nadpisywanie pliku to użyj FileOutputstream(String filename, boolean append).
[/quote]

Chyba dopisywanie ;)

Dzięki za wyczerpującą odpowiedź ;)
Nie wiem czemu czasami nazwy metod pisałem z dużej litery, a zapoznałem się z konwencją nazewnictwa.

M9
  • Rejestracja:ponad 8 lat
  • Ostatnio:ponad 6 lat
  • Postów:140
0

dobra poprawiłem to trochę

Kopiuj
 import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;
 
public class Operacje{
 
    ArrayList <Pracownik> result=new ArrayList<Pracownik>();
    public Pracownik workers[]=null;
    public Operacje(){
        try{
            ObjectInputStream s=new ObjectInputStream(new FileInputStream("Database.ur"));
            workers=(Pracownik[])s.readObject();
            s.close();
        }catch(Exception e){
        		System.out.println(e.getMessage());
        }   
    }
 
    public  void search (String type,String value){
        result.clear();
        if (type.equals("zarobki")){
            int ernings=new Integer(value);
            for (int i=0;i<workers.length;i++){
                if(workers[i].getEarnings()==ernings){
                    result.add(workers[i]);
                }
            }
        }
 
        else if (type.equals("nazwisko")){
            for (int i=0;i<workers.length;i++){
                if(workers[i].getSurname().equals(value)){
                    result.add(workers[i]);
                }
            }
        }
 
        else if(type.equals("pesel")){
            for (int i=0;i<workers.length;i++){
                if(workers[i].getPesel().equals(value)){
                    result.add(workers[i]);
                }
            }
        }
 
        else if (type.equals("stanowisko")){
            for (int i=0;i<workers.length;i++){
                if(((workers[i] instanceof Admnistracyjny) && (((Admnistracyjny)workers[i])).getPost().equals(value))){
                    result.add(workers[i]);
                }
        }
        }
 
        else if (type.equals("przedmiot")){
            for (int i=0;i<workers.length;i++){
                if(((workers[i] instanceof Dydaktyczny) && (((Dydaktyczny)workers[i])).getSubject().equals(value))){
                    result.add(workers[i]);
                }
        }
        }
    }
 
    public void saveFile(Pracownik tab1[]) throws FileNotFoundException{
    	Pracownik[] allWorkers=new Pracownik[(tab1.length+workers.length)];
    	System.arraycopy(workers, 0, allWorkers, 0, workers.length);
    	System.arraycopy(tab1, 0, allWorkers, workers.length, tab1.length);
        try{
            ObjectOutputStream save=new ObjectOutputStream(new FileOutputStream("Database.ur"));
            save.writeObject(allWorkers);
            save.close();
        }
        catch(Exception e){
 
        }
 
        System.out.println("Zapisano");
    }
 
    public void output(){
        if(result.isEmpty()){
            System.out.println("Brak pracowników o danych parametrach");
        }
        else{
            for(Pracownik p:result){
                System.out.println(p.toString());
            }
        }
    }
    public void wypiszWszystkich(){
        for (int i=0;i<workers.length;i++){
            System.out.println(workers[i].toString);
        }
    }
}

dziedziczenie mam w ten sposób Pracownik (implementuje Serializable) po nim dziedziczy Administracyjny i Naukowy (już nie implementują Serializable)
Mam przygotowaną tablicę z jednym pracownikiem, wywala mi błąd na odczycie tablicy Admnistracyjny; no valid constructor w debugerze pokazuje że jest ona pusta

edytowany 1x, ostatnio: Masterpc96
jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około godziny
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4707
1

Te trzy linijki to wywal - nie wiem co chciałeś uzyskać - ale niepotrzebne są ( i raczej zrypane):

Kopiuj
     Pracownik[] allWorkers=new Pracownik[(tab1.length+workers.length)];
        System.arraycopy(workers, 0, allWorkers, 0, workers.length);
        System.arraycopy(tab1, 0, allWorkers, workers.length, tab1.length);

Dla pewności wywal stare zapisane 'Database.ur'. może masz tam jakieś śmieci.

A jak nie zadziała - to nie wstydź się -> pokaż tego stack trace całego - oraz klasy Administracyjny i Naukowy (nie chce mi się zgadywać co tam masz).

Poprawka - chyba wiem co chciałeś uzyskać:
Więc zmień metodę save na taką:

Kopiuj
  public void saveFile(Pracownik tab1[]) throws IOException{
        Pracownik[] allWorkers=new Pracownik[(tab1.length+workers.length)];
        System.arraycopy(workers, 0, allWorkers, 0, workers.length);
        System.arraycopy(tab1, 0, allWorkers, workers.length, tab1.length);

       workers = allWorkers;
            ObjectOutputStream save=new ObjectOutputStream(new FileOutputStream("Database.ur"));
            save.writeObject(workers);
            save.close();
 
        System.out.println("Zapisano");
    }
    

jeden i pół terabajta powinno wystarczyć każdemu
edytowany 1x, ostatnio: jarekr000000
M9
  • Rejestracja:ponad 8 lat
  • Ostatnio:ponad 6 lat
  • Postów:140
0

Wywaliłem dane zapisałem pracownika na nowo do pustego pliku nie działa tylko odczyt
klasa pracownik administracyjny

Kopiuj
 
public class Admnistracyjny extends Pracownik{
	private String post;
	public Admnistracyjny (String name, String surname, byte age, String pesel, int earnings,String post){
		super(name,surname,age,pesel,earnings);
		this.post=post;
	}
	
	public String getPost(){return post;}
	
	public String toString(){
		return(super.toString()+ " " + getPost());
	}
}

Klasa pracownik Dydaktyczny

Kopiuj
 
public class Dydaktyczny extends Pracownik{
	private String subject;
	public Dydaktyczny (String name, String surname, byte age, String pesel, int earnings,String subject){
		super(name,surname,age,pesel,earnings);
		this.subject=subject;
	}
	
	public String getSubject(){return subject;}
	
	public String toString(){
		return(super.toString()+ " " + getSubject());
	}
}

Klasa Pracownik

Kopiuj
 import java.io.Serializable;

abstract public class Pracownik extends Osoba implements Serializable{
	private int earnings;
	public Pracownik (String name, String surname, byte age, String pesel, int earnings){
		super (name, surname, age, pesel);
		this.earnings=earnings;
	}
	
	int getEarnings(){return earnings;}
	
	public String toString(){
		return(getName() + " " + getSurname() + " " + getAge() + " " + getPesel() + " " + getEarnings());
	}
}

jeszcze klasa Osoba

Kopiuj
 public abstract class Osoba {
	private String name,surname, pesel;
	private byte age;
	public Osoba(String name, String surname, byte age, String pesel){
		this.name=name;
		this.surname=surname;
		this.age=age;
		this.pesel=pesel;
	}
	String getName(){return name;}
	String getSurname(){return surname;}
	String getPesel(){return pesel;}
	byte getAge(){return age;}
	
}

Exception in thread "main" java.lang.NullPointerException at Operacje.wypiszWszystkich(Operacje.java:90) at Test.main(Test.java:76)
Pokazuje na linijkę wypisania

Kopiuj
 System.out.println(workers[i].toString);

Ps chodzi o to ?

edytowany 4x, ostatnio: Masterpc96
jarekr000000
@Masterpc96: podaj tego stacke trace - co nie działa?
jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około godziny
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4707
0
Masterpc96 napisał(a):
Kopiuj
 System.out.println(workers[i].toString);

Ps chodzi o to ?

Tak.
Nie widze błędu - ale możesz trochę sobie pomóc używając debugera.
Trzeba sprawdzić co jest przez zapisem w workers, i co jest po odczycie.

Możesz to tez zrobić wypisując na konsole.
System.out.println(Arrays.toString(this.workers));
Zrób to przed writeObject i po readObject - powinno coś być widać.

(Ogólnie to strzelam (bo nie widzę oczywistego błędu w podanym przez Ciebie kodzie), że możesz mieć błąd w Test.java)


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 3x, ostatnio: jarekr000000
M9
  • Rejestracja:ponad 8 lat
  • Ostatnio:ponad 6 lat
  • Postów:140
0

Zapis jest prawidłowy
EDIT

Kopiuj
 public void saveFile(Pracownik tab1[]) throws IOException{
        //Pracownik[] allWorkers=new Pracownik[(tab1.length+workers.length)];
        //System.arraycopy(workers, 0, allWorkers, 0, workers.length);
        //System.arraycopy(tab1, 0, allWorkers, workers.length, tab1.length);

       workers = tab1;
       for (int i=0;i<workers.length;i++){
           System.out.println(workers[i].toString());
       }

            ObjectOutputStream save=new ObjectOutputStream(new FileOutputStream("Database.ur"));
            save.writeObject(workers);
            save.close();

        System.out.println("Zapisano");
    }
 
    public void output(){
        if(result.isEmpty()){
            System.out.println("Brak pracowników o danych parametrach");
        }
        else{
            for(Pracownik p:result){
                System.out.println(p.toString());
            }
        }
    }

wybierz cyfrę

  1. Szukaj pracownika
  2. Dodaj pracownika
  3. Wypisz wszystkich
    2
    Admnistracyjny; no valid constructor
    Podaj typ pracownika jaki chcesz dodać
    1.Administracyjny
    2.Dydaktyczny
    1
    Ilu chcesz dodać pracowników
    1
    Podaj dane pracownika w tym formacie
    imię;nazwisko;wiek;pesel;zarobki;dział
    Jan;Kowalski;55;58959665;5500;kadry // to podaję ja
    Jan Kowalski 55 58959665 5500 kadry // to wyświetla
    Zapisano

A błędem nie jest to że Administracyjny i Dydaktyczny mają konstruktor ze średnikami bo tak rozdziela dane podane przeze mnie a w zapisie w tablicy nie mam tych średników i w odczycie wywala błąd?

edytowany 2x, ostatnio: Masterpc96
jarekr000000
@Masterpc96: ale nie wyświetlaj workers[0] - tyllko całą tablicę, śmierdzi mi tam nullem - może w w tab1[] są jakieś nulle?
jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około godziny
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4707
1
Masterpc96 napisał(a):

A błędem nie jest to że Administracyjny i Dydaktyczny mają konstruktor ze średnikami bo tak rozdziela dane podane przeze mnie a w zapisie w tablicy nie mam tych średników i w odczycie wywala błąd?

Nie. ( Nie do końca wiem o czym piszesz :-), ale to raczej nie jest problem).

Wróżka modde. Zgaduję - Błąd masz w tym, że wywołując saveFile podajesz tablicę, która jest np. długości 10, a ma wypełnioną tylko 1 pozycję.


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 1x, ostatnio: jarekr000000
M9
Zobacz post wyżej wypis z pętli. Też mi się wydaje że to nie powinien być błąd bo zapisuję konkretną tablicę którą potem odczytuję i do tego samego typu przypisuję. Jak odczytałem tablicę forem to mam pewność że tam nulli nie ma
M9
  • Rejestracja:ponad 8 lat
  • Ostatnio:ponad 6 lat
  • Postów:140
0

Tu mam wywołanie metody saveFile

Kopiuj
 else if(choice==2){
			int amount=0;
			byte type=0;
			String s1;
			String s2[]= new String[6];	
			System.out.println("Podaj typ pracownika jaki chcesz dodać\n1.Administracyjny\n2.Dydaktyczny");
			type=s.nextByte();
			System.out.println("Ilu chcesz dodać pracowników");
			amount=s.nextInt();
			Pracownik workersH[]=new Pracownik[amount];
			
			if (type==1){
				System.out.println("Podaj dane pracownika w tym formacie\nimię;nazwisko;wiek;pesel;zarobki;dział");
				for (int i=0;i<amount;i++){			
					BufferedReader we=new BufferedReader(new InputStreamReader(System.in));
					try{
						s1=we.readLine();
						if ((s1!=null) || (!s1.equals(""))){
							s2=s1.split(";");
						}
					}catch (IOException e){
						e.printStackTrace();
					}
					workersH[i]=new Admnistracyjny(s2[0].trim(),s2[1].trim(),new Byte(s2[2].trim()),s2[3].trim(),new Integer(s2[4].trim()),s2[5].trim());				
			}
				
			}
			
			else if(type==2){
				System.out.println("Podaj dane pracownika w tym formacie\nimię;nazwisko;wiek;pesel;zarobki;przedmiot");
				for (int i=0;i<amount;i++){			
					BufferedReader we=new BufferedReader(new InputStreamReader(System.in));
					try{
						s1=we.readLine();
						if ((s1!=null) || (!s1.equals(""))){
							s2=s1.split(";");
						}
					}catch (IOException e){
						e.printStackTrace();
					}
					workersH[i]=new Dydaktyczny(s2[0].trim(),s2[1].trim(),new Byte(s2[2].trim()),s2[3].trim(),new Integer(s2[4].trim()),s2[5].trim());				
			}
			}
			
			task.saveFile(workersH);
		}

Nuli nie powinno być bo jak odczytuję całą tablicę forem to jest tylko ten jeden rekord

jarekr000000
@Masterpc96: nie widzę błędu ... ale co to jest: "Admnistracyjny; no valid constructor" ? Kto to wyświetla i w której lini?
M9
to się bierze z bloku try catch w konstruktorze operacje System.out.println(e.getMessage), bo nazwa pliku razem z rozszerzeniem może być dowolna, w przykładach podawali *.ser
jarekr000000
@Masterpc96: nie wydaje mi się - nie pisz nigdzie w catch System.out.println(e.getMessage) tylko e.printStackTrace() albo nawet lepiej throw new RuntimeException(e), albo nawet lepiej - nie rób catch, W każdym razie warto by sprawdzić skąd dokładnie leci to "no valid constructor"
M9
Zobacz post niżej :)
M9
  • Rejestracja:ponad 8 lat
  • Ostatnio:ponad 6 lat
  • Postów:140
0

to wywala komunikat z ClassNotFoundException

Kopiuj
 public Operacje() throws IOException, ClassNotFoundException{
            ObjectInputStream s=new ObjectInputStream(new FileInputStream("Database.ur"));
            workers=(Pracownik[])s.readObject();
            for(int i=0;i<workers.length;i++){
            	System.out.println(workers[i]);
            }
            s.close();  
    }

Exception in thread "main" java.io.InvalidClassException: Admnistracyjny; no valid constructor
at java.io.ObjectStreamClass$ExceptionInfo.newInvalidClassException(ObjectStreamClass.java:150)
at java.io.ObjectStreamClass.checkDeserialize(ObjectStreamClass.java:790)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1782)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1353)
at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1714)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:373)
at Operacje.<init>(Operacje.java:14)
at Test.main(Test.java:15)

Te błędu dotyczą tylko i wyłącznie odczytu

jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około godziny
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4707
2

Dobra - chyba już wiem :

zmień tak klasę Osoba
public abstract class Osoba implements Serializable

A pokonała Cie kiepska obsługa Exceptionów. Nie rób nigdy catch( Exception e) jeśli nie musisz


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 1x, ostatnio: jarekr000000
M9
  • Rejestracja:ponad 8 lat
  • Ostatnio:ponad 6 lat
  • Postów:140
0

Już zmieniam, w klasie Pracownik już nie muszę implementować Serializable? Czy Exception e wyłapuje najogólniejszy wyjątek?

jarekr000000
@MasterPC: Już nie musisz. A co do exceptionów - to jak nie wiesz co zrobić to puść dalej. Nie rób catch (Exception) i potem tylko e.getMessage() - bo takie linijki giną gąszczu komunikatów na ekranie. Jak się coś wywali - to ma ekran krwawić na czerwono od stack trace. Najogólniejszy wyjątek to catch(Throwable ) - jak ktoś tak zrobi w firmie w kodzie to od razu jest dyscyplinarka :-) za catch ( Exception e) - tylko cofnięcie premii rocznej. (to trochę żart, troche nie żart).
M9
Puść dalej czyli mam dać możliwość wyrzucenia wyjątku nie w bloku try catch tylko przy deklarowaniu metody przez throws?
jarekr000000
@Masterpc96: Jak nie wiesz co robić - to możesz robić tak: catch (TenJedenSpecyficznyWyjątekDoKtoregoObługiZmuszaMnieKompiltor_Kurde e) { throw new RuntimeException(e); }. To są najmniejsze względnie szkody. Dodawanie throws do metody to też na ogół problem (potem powstają metody z całym łańcuchem throwsów - co rzucają wszystkim). Tu są "proste" reguły : http://howtodoinjava.com/best-practices/java-exception-handling-best-practices/
M9
  • Rejestracja:ponad 8 lat
  • Ostatnio:ponad 6 lat
  • Postów:140
0

jak zostawię Serializable tylko w klasie osoba to wywala ten błąd
Exception in thread "main" java.io.InvalidClassException: Pracownik; local class incompatible: stream classdesc serialVersionUID = 4643746275836876983, local class serialVersionUID = 8358143979088759527
at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:616)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1630)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1521)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1630)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1521)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1781)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1353)
at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1714)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:373)
at Operacje.<init>(Operacje.java:14)
at Test.main(Test.java:15)

A jak w klasie pracowników również będzie zaimplementowany to działa prawie dobrze bo na imię i nazwiko (tylko) wypisuje null ale to zaraz poprawię

Ps. Dzięki za pomoc :D
EDIT

Musiałem na nowo utworzyć plik gdy interface jest zaimplementowany w Osoba
Jeszcze raz WIELKIE DZIĘKI :)

edytowany 2x, ostatnio: Masterpc96
jarekr000000
@Masterpc96: mten błąd oznacza, że masz zapisane obiekty w starej wersji. Skasuj plik i bedzie dobrze. Możesz do każdej klasy zapisywalnej dodać: private static final long serialVersionUID = 1L; . To taki znacznik wersji. Wtędy będziesz je mógł trochę zmieniać i się nie bedzie ciągle wywalać
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)