[英]“java.lang.ArrayIndexOutOfBoundsException: -1” while adding tab to “javax.swing.JTabbedPane”
[英]javax.swing.JTabbedPane not serializable?
當我想反序列化一個 JTabbedPane 時,我得到一個 NullPointerException。
我的代碼如下:
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 = "/tmp/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();
System.out.println("readPane: " + readPane.toString());
oin.close();
fin.close();
} catch (IOException e1) {
e1.printStackTrace();
} catch (ClassNotFoundException e2) {
e2.printStackTrace();
}
}
}
當我使用 OpenJDK 運行此代碼時 8 9 , OpenJDK 11 or Oracle JDK 14.0.1 on Ubuntu 20.04 as well as OpenJDK 9 and Oracle JDK 14 on Win 10 (version 1909), I get the following or very similar stacktrace (here, I show the output of Oracle JDK 14.0. 1 上 Ubuntu 20.04):
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)
我知道,序列化 Swing 對象是個壞主意。 但是,我必須處理的代碼大量使用了 Java Swing 的序列化功能。
因此,如果有人能指出我在反序列化 JTabbedPane 時所犯的錯誤,我將不勝感激。
更新: @GeorgeZ. 的評論讓我研究了不同的 JDK 和操作系統: JDK 8在 Ubuntu 20.04(OpenJDK 1.8.0_252 -與我在原始帖子中寫的相反)和 Win 10 build 1909(OpenJDK 1.8.0_41)。 JDK 9 and above produces the NullPointerException (on Win10: OpenJDK 9 build 9+181 and Oracle JDK 14.0.1; on Ubuntu 20.04: OpenJDK 9 build 9+181, OpenJDK 11.0.7 and Oracle JDK 14.0.1). 因此,這似乎是一種回歸。
目前,JTabbedPane 無法在 JDK 9 和更新版本的 JDK 中反序列化,包括 JDK 15 的早期訪問版本。
我提交了一份錯誤報告,您可以在https://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8245785找到該報告。
作為一種解決方法,您可以
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.