JDK-8245785 : javax.swing.JTabbedPane cannot be deserialized
  • Type: Bug
  • Component: client-libs
  • Sub-Component: javax.swing
  • Affected Version: 9,11,14,15
  • Priority: P3
  • Status: Resolved
  • Resolution: Fixed
  • OS: linux_ubuntu
  • CPU: x86_64
  • Submitted: 2020-05-23
  • Updated: 2020-07-30
  • Resolved: 2020-07-18
The Version table provides details related to the release that this issue/RFE will be addressed.

Unresolved : Release in which this issue/RFE will be addressed.
Resolved: Release in which this issue/RFE has been resolved.
Fixed : Release in which this issue/RFE has been fixed. The release containing this fix may be available for download as an Early Access Release or a General Availability Release.

To download the current JDK release, click here.
JDK 16
16 b08Fixed
Description
ADDITIONAL SYSTEM INFORMATION :
I could reproduce the bug on Ubuntu 20.04 with the following JDKs 15, 14, 11 and 9: 

OpenJDK 15-ea build 15-ea+24-1168 , Oracle JDK 14.0.1, OpenJDK 11.0.7, OpenJDK 9 build 9+181

I could reproduce the bug on Windows 10 build 1909 with the following JDKs 14 and 9:

Oracle JDK 14.0.1, OpenJDK 9 build 9+181

However, with JDK 8 everything went fine. I've checked it on Win10 with OpenJDK 1.8.0_41  and on Ubuntu 20.04 with OpenJDK 1.8.0_252.

A DESCRIPTION OF THE PROBLEM :
When I want to deserialize a serialized JTabbedPane-object, I get a NullPointerException. I use ObjectInputStream.readObject() for deserializing the JTabbedPane instance.

REGRESSION : Last worked in version 8u251

STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Just compile and run the following code in Bee.java:
javac Bee.java
java -cp . Bee

EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
Output of the toString() method of the deserialized JTabbedPane as with JDK 8:

readPane: javax.swing.JTabbedPane[,0,0,0x0,invalid,layout=javax.swing.plaf.metal.MetalTabbedPaneUI$TabbedPaneLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=352,maximumSize=,minimumSize=,preferredSize=,haveRegistered=false,tabPlacement=TOP]
ACTUAL -
 ~/Downloads/tmp/openjdk15/jdk-15/bin/javac *.java && ~/Downloads/tmp/openjdk15/jdk-15/bin/java -cp . Bee

Exception in thread "main" java.lang.NullPointerException
	at java.desktop/javax.swing.JTabbedPane.getTabCount(JTabbedPane.java:1118)
	at java.desktop/javax.swing.plaf.basic.BasicTabbedPaneUI.installTabContainer(BasicTabbedPaneUI.java:308)
	at java.desktop/javax.swing.plaf.basic.BasicTabbedPaneUI.installComponents(BasicTabbedPaneUI.java:304)
	at java.desktop/javax.swing.plaf.basic.BasicTabbedPaneUI.installUI(BasicTabbedPaneUI.java:248)
	at java.desktop/javax.swing.JComponent.setUI(JComponent.java:685)
	at java.desktop/javax.swing.JTabbedPane.setUI(JTabbedPane.java:253)
	at java.desktop/javax.swing.JTabbedPane.updateUI(JTabbedPane.java:269)
	at java.desktop/javax.swing.SwingUtilities.updateComponentTreeUI0(SwingUtilities.java:1363)
	at java.desktop/javax.swing.SwingUtilities.updateComponentTreeUI(SwingUtilities.java:1354)
	at java.desktop/javax.swing.JComponent$ReadObjectCallback.validateObject(JComponent.java:5457)
	at java.base/java.io.ObjectInputStream$ValidationList$1.run(ObjectInputStream.java:2758)
	at java.base/java.io.ObjectInputStream$ValidationList$1.run(ObjectInputStream.java:2756)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:691)
	at java.base/java.io.ObjectInputStream$ValidationList.doCallbacks(ObjectInputStream.java:2754)
	at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:506)
	at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:457)
	at Bee.main(Bee.java:31)


---------- BEGIN SOURCE ----------
import javax.swing.*;
import java.io.*;

public class Bee {

    public static void main(final String[] args) {

        // --------- create tabbed pane
        JTabbedPane tabbedPane = new JTabbedPane();

        // ------------ Test serializing -------------------
        final String file = "swing.ser";
        FileOutputStream fout = null;
        ObjectOutputStream out = null;
        FileInputStream fin = null;
        ObjectInputStream oin = null;

        try {
            // ______________________ Write tabbedPane... _______________________
            fout = new FileOutputStream(file);
            out = new ObjectOutputStream(fout);

            out.writeObject(tabbedPane);

            out.close();

            // ____________________________reading pane___________________
            fin = new FileInputStream(file);
            oin = new ObjectInputStream(fin);

            final JTabbedPane readPane = (JTabbedPane) oin.readObject(); // Das gespeiherte wieder Lese!
            System.out.println("readPane: " + readPane.toString());
            oin.close();
            fin.close();
        } catch (IOException e1) {
            e1.printStackTrace();
        } catch (ClassNotFoundException e2) {
            e2.printStackTrace();
        }
    }
}

---------- END SOURCE ----------

CUSTOMER SUBMITTED WORKAROUND :
My current workaround is to use JDK 8 instead of a newer one.

FREQUENCY : always



Comments
URL: https://hg.openjdk.java.net/jdk/jdk/rev/1344412a7e68 User: psadhukhan Date: 2020-07-26 09:18:55 +0000
26-07-2020

URL: https://hg.openjdk.java.net/jdk/client/rev/1344412a7e68 User: psadhukhan Date: 2020-07-18 06:40:52 +0000
18-07-2020

Issue is observed in JDK 9_b_140 and above and not observed in JDK 8 OS: Linux JDK 8u251 Pass JDK 8u271 b_98 Pass JDK 9 b140 Fail JDK 9.0.4 Fail JDK 11 Fail JDK 14 Fail JDK 15 ea24 Fail
26-05-2020