Co oznacza wyjątek NotSerializableException?

0

Co moze oznaczać ten wyjątek ? Na poczatku to wszystko co jest ponizej moze wydawac sie chaotyczne ale na ta chwile nie potrafilem inaczej przedstawic problemu :)

 
java.io.NotSerializableException: javax.swing.JTable$CellEditorRemover
	at java.io.ObjectOutputStream.writeObject0(Unknown Source)
	at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source)
	at java.io.ObjectOutputStream.defaultWriteObject(Unknown Source)
	at javax.swing.JTable.writeObject(Unknown Source)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at java.io.ObjectStreamClass.invokeWriteObject(Unknown Source)
	at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
	at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
	at java.io.ObjectOutputStream.writeObject0(Unknown Source)
	at java.io.ObjectOutputStream.writeObject(Unknown Source)
	at javax.swing.event.EventListenerList.writeObject(Unknown Source)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at java.io.ObjectStreamClass.invokeWriteObject(Unknown Source)
	at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
	at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
	at java.io.ObjectOutputStream.writeObject0(Unknown Source)
	at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source)
	at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
	at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
	at java.io.ObjectOutputStream.writeObject0(Unknown Source)
	at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source)
	at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
	at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
	at java.io.ObjectOutputStream.writeObject0(Unknown Source)
	at java.io.ObjectOutputStream.writeObject(Unknown Source)
	at java.util.HashMap.internalWriteEntries(Unknown Source)
	at java.util.HashMap.writeObject(Unknown Source)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at java.io.ObjectStreamClass.invokeWriteObject(Unknown Source)
	at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
	at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
	at java.io.ObjectOutputStream.writeObject0(Unknown Source)
	at java.io.ObjectOutputStream.writeObject(Unknown Source)
	at program.PanelStatystyki$4.actionPerformed(PanelStatystyki.java:308)
	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
	at java.awt.EventQueue.access$500(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue$4.run(Unknown Source)
	at java.awt.EventQueue$4.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at javax.swing.plaf.basic.BasicTableUI.getPreferredSize(Unknown Source)
	at javax.swing.JComponent.getPreferredSize(Unknown Source)
	at javax.swing.ScrollPaneLayout.layoutContainer(Unknown Source)
	at java.awt.Container.layout(Unknown Source)
	at java.awt.Container.doLayout(Unknown Source)
	at java.awt.Container.validateTree(Unknown Source)
	at java.awt.Container.validate(Unknown Source)
	at javax.swing.RepaintManager$3.run(Unknown Source)
	at javax.swing.RepaintManager$3.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at javax.swing.RepaintManager.validateInvalidComponents(Unknown Source)
	at javax.swing.RepaintManager$ProcessingRunnable.run(Unknown Source)
	at java.awt.event.InvocationEvent.dispatch(Unknown Source)
	at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
	at java.awt.EventQueue.access$500(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)

(PanelStatystyki.java:308) to jest :

 
zapiszUzytkownicy.writeObject(ramka.getUzytkownicyMapa());

W tym wszystkim chodzi o to że próbuje zapisać DefaultTableModel do pliku. Ponizej pełny kod tej operacji.

 
przyciskDodaj.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
			
			double waga = Double.parseDouble(poleWaga.getText());
			double wzrost = Double.parseDouble(poleWzrost.getText());
			wzrost = wzrost/100;
			double bmi = waga/(Math.pow(wzrost,2));
			java.text.DecimalFormat df=new java.text.DecimalFormat(); 
			df.setMaximumFractionDigits(2); 
			df.setMinimumFractionDigits(2); 
			ramka.getUzytkownicyMapa().get(zalogowany).getTabelaInformacje().addRow(new Object[]{poleData.getText(),poleWiek.getText(),poleWaga.getText(),poleWzrost.getText(),df.format(bmi)});
			DefaultTableModel a = ramka.getUzytkownicyMapa().get(zalogowany).getTabelaInformacje();
			ramka.getUzytkownicyMapa().get(zalogowany).setabelaInformacje(a);
			poleWiek.setText("");
			poleWaga.setText("");
			poleWzrost.setText("");
			
			try {
				FileOutputStream PolaczZapiszUzytkownicy = new FileOutputStream("uzytkowinicyStan.ser");
				ObjectOutputStream zapiszUzytkownicy = new ObjectOutputStream(PolaczZapiszUzytkownicy);
				zapiszUzytkownicy.writeObject(ramka.getUzytkownicyMapa());
				zapiszUzytkownicy.close();
			} catch (Exception ex) {
				// TODO Auto-generated catch block
				ex.printStackTrace();
			}
			
			
			
			}
		});

Poniżej wrzuce jeszcze w jaki sposób tworzę nowego użytkownika.

 
nKolumn = new String[]{"data","wiek","waga","wzrost","BMI"};
nKomorek = new Object [0][0];
modelTabeli = new DefaultTableModel(nKomorek,nKolumn);

 uzytkownik = new Uzytkownik(poleImie.getText(),poleNazwisko.getText(),ple,poleEmail.getText(),poleLogin.getText(),poleHaslo.getText(),modelTabeli);	
		 
		    
		    ramka.getUzytkownicyMapa().put(poleLogin.getText(),uzytkownik);
		    
		    
		    PoleInformacjiOUzytkowniku.append("Dodano uzytkownika"+"\n");			 
		    PoleInformacjiOUzytkowniku.append("imie :" + " " + uzytkownik.getImie()+"\n");
		    PoleInformacjiOUzytkowniku.append("nazwisko :" + " " + uzytkownik.getNazwisko()+"\n");
		    PoleInformacjiOUzytkowniku.append("plec :" + " " + uzytkownik.getPlec()+"\n");
		    PoleInformacjiOUzytkowniku.append("email :" + " " + uzytkownik.getAdresEmail()+"\n");
		    PoleInformacjiOUzytkowniku.append("-------------------------------------------" + "\n");
		    PoleInformacjiOUzytkowniku.append("login :" + " " + uzytkownik.getLogin()+"\n");
		    PoleInformacjiOUzytkowniku.append("haslo :" + " " + uzytkownik.getHaslo()+"\n");
		   
		    System.out.println(ramka.getUzytkownicyMapa().get(poleLogin.getText()).getImie());
		    		
		    poleImie.setText("");
		    poleNazwisko.setText("");
		    poleEmail.setText("");
		    poleLogin.setText("");
		    poleHaslo.setText("");
		    
		    try {
				FileOutputStream PolaczZapiszUzytkownicy = new FileOutputStream("uzytkowinicyStan.ser");
				ObjectOutputStream zapiszUzytkownicy = new ObjectOutputStream(PolaczZapiszUzytkownicy);
				zapiszUzytkownicy.writeObject(ramka.getUzytkownicyMapa());
				zapiszUzytkownicy.close();
			} catch (Exception ex) {
				// TODO Auto-generated catch block
				ex.printStackTrace();
			}
		    }
		    else {
		    	PoleInformacjiOUzytkowniku.setForeground(Color.red);
		    	PoleInformacjiOUzytkowniku.append("Proszę o uzupełnienie wszystkich danych\n");
		    	};
		}
	});
	

2

Krótka odpowiedź: bo to co serializujesz widocznie ma jakieś nie-serializowalne pole.
Generalnie serializowanie komponentów swinga to średni pomysł, bo możesz tam mieć jakieś listenery i inne cuda wianki które się nie serializują. Czemu nie zapisujesz samych danych?

0

Wszystko sie sypie kiedy usuwam wiersze i zapisuje ramka.getUzytkownicyMapa() - czyli HashMap stworzona w klasie ramki

 
przyciskUsunOstatniWpis.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {

ramka.getUzytkownicyMapa().get(zalogowany).getTabelaInformacje().removeRow(ramka.getUzytkownicyMapa().get(zalogowany).getTabelaInformacje().getRowCount() - 1);

DefaultTableModel a = ramka.getUzytkownicyMapa().get(zalogowany).getTabelaInformacje();

ramka.getUzytkownicyMapa().get(zalogowany).setabelaInformacje(a);	

});

Kiedy dodaje wiersze i zapisuje jest ok

 
przyciskDodaj.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
			
double waga = Double.parseDouble(poleWaga.getText());

double wzrost = Double.parseDouble(poleWzrost.getText());

wzrost = wzrost/100;

double bmi = waga/(Math.pow(wzrost,2));

java.text.DecimalFormat df=new java.text.DecimalFormat(); 
df.setMaximumFractionDigits(2); 
df.setMinimumFractionDigits(2); 

ramka.getUzytkownicyMapa().get(zalogowany).getTabelaInformacje().addRow
(new Object[{poleData.getText(),poleWiek.getText(),poleWaga.getText(),poleWzrost.getText(),df.format(bmi)});

DefaultTableModel a = ramka.getUzytkownicyMapa().get(zalogowany).getTabelaInformacje();

ramka.getUzytkownicyMapa().get(zalogowany).setabelaInformacje(a);

poleWiek.setText("");

poleWaga.setText("");

poleWzrost.setText("");
			
			
			}
		});
0

@Shalom zapisuje DefaultTableModel poniewaz mam klase uzytkownika składającą sie z pół:

 
public class Uzytkownik implements Serializable 
{
private String imie;
private String nazwisko;
private String plec;
private String adresEmail;
private String login;
private String haslo;
public static String zalogowany = "konrad";
private DefaultTableModel tabelaInformacje;

JTable chyba nie zapisuje.
Jakie jest lepsze rozwiązanie żeby zapsiywać taką tabelę zamiast całej DefaultTableModel może lepiej zrobić tak?

 
public class Uzytkownik implements Serializable 
{
private String imie;
private String nazwisko;
private String plec;
private String adresEmail;
private String login;
private String haslo;
public static String zalogowany = "konrad";
private final  String[] nKolumn = new String[]{"data","wiek","waga","wzrost","BMI"};
private Object[] nKomorek ;
	

Nastepnie w klasie gdzie jest JTable tworzyć ja:

 
tabelaStatystyki = new JTable(ramka.getUzytkownicyMapa().get(zalogowany).getnKomorek , ramka.getUzytkownicyMapa().get(zalogowany).getnKolumn); 

1

Mści się niewłaściwy wybór modelu - klasa Object nie implementuje interfejsu Serializable. U Ciebie, znacznie lepszym kandydatem na model byłby Vector<Uzytkownik>, nie Object[][].

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