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, botów: 0