我希望序列化一个显示带有 JScrollBar 的 JFrame 的类。程序保存和加载正常,除非 JScrollBar 变得可见,此时我得到以下异常:
线程“AWT-EventQueue-0”java.lang.NullPointerException 中的异常:无法调用“javax.swing.JScrollPane.getViewportBorder()”,因为“this.scrollpane”为空
当我收到此异常时,程序随后无法正确加载。
我已经尽可能地减少了我的代码以隔离问题,现在我被卡住了。我所知道的是,如果我在 run() 方法中声明 JFrame,我必须用 frame.setVisible(true) 替换 backgroundPanel.repaint() 并且一切正常。但是我需要在完整程序的 run() 方法之外访问 JFrame。我发现的唯一另一件事是,即使在 JScrollBar 本身变得可见之前,JScrollBar 的 getViewportBorder() 方法也会返回 null,尽管只有在栏变得可见时序列化才会失败。
这是有问题的代码:
import java.io.*;
import java.lang.Runnable;
import javax.swing.*;
class GameLauncher implements Runnable, Serializable {
public static void main(String[] args) {
new Thread(new GameLauncher()).start();
}
JFrame frame;
public void run() {
frame = new JFrame("Frame");
JPanel backgroundPanel = new JPanel();
JScrollPane scrollPane = new JScrollPane();
scrollPane.setViewportView(backgroundPanel);
frame.add(scrollPane);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(100, 100);
frame.setVisible(true);
for (int i = 0; i < 3; i++) {
backgroundPanel.add(new JLabel("Text"));
backgroundPanel.repaint();
saveFile();
}
}
private void saveFile() {
try {
ObjectOutputStream objectOut = new ObjectOutputStream(new FileOutputStream(new File("save.ser")));
objectOut.writeObject(this);
objectOut.close();
System.out.println("File saved");
}
catch(IOException ex) {
System.out.println("File not saved");
ex.printStackTrace();
}
}
}
编辑:我意识到我的问题不清楚。保存文件时出现错误,而不是加载文件时出现错误。如果在保存过程中发生错误,它只是无法正确加载。