Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 保存单例对象_Java_Serialization_Object_Singleton_Save - Fatal编程技术网

Java 保存单例对象

Java 保存单例对象,java,serialization,object,singleton,save,Java,Serialization,Object,Singleton,Save,我知道这个网站不是为这样的问题,但我一直在寻找答案,我没有找到任何东西,我需要一个确认 我有一个singleton类,它是我程序的中心,在某些情况下,我试图保存它的状态,但是它似乎没有正确保存,我不明白为什么,因为这不是我第一次这样做,但是这是我第一次尝试保存singleton,所以可以保存singleton对象吗? 这是我加载和保存此对象的代码 public void Loading(String name) { ObjectInputStream is = null; //ign

我知道这个网站不是为这样的问题,但我一直在寻找答案,我没有找到任何东西,我需要一个确认

我有一个singleton类,它是我程序的中心,在某些情况下,我试图保存它的状态,但是它似乎没有正确保存,我不明白为什么,因为这不是我第一次这样做,但是这是我第一次尝试保存singleton,所以可以保存singleton对象吗? 这是我加载和保存此对象的代码

 public void Loading(String name) {
    ObjectInputStream is = null;
 //ignore this variable
    game_loaded = 1;
    try {
        is = new ObjectInputStream(new FileInputStream(name + ".dat"));
                 //Logica is the singleton class, 
                 //logi is the name of the variable where it is
        logi = (Logica) is.readObject();
    } catch (FileNotFoundException e1) {
        JOptionPane.showOptionDialog(frame, "Game Invalid", "Load",
                JOptionPane.YES_NO_OPTION, JOptionPane.INFORMATION_MESSAGE,
                null, new String[] { "Ok" }, "Ok");
        return;

    } catch (IOException e1) {

    } catch (ClassNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    try {
        is.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block

    }

    JOptionPane.showOptionDialog(frame, "Game Loaded Sucessfully", "Load",
            JOptionPane.YES_NO_OPTION, JOptionPane.INFORMATION_MESSAGE,
            null, new String[] { "Ok" }, "Ok");

}
保存:

} 编辑


好吧,我可能已经正确解释了,它不会给我任何错误加载,但是它不会加载我保存的状态,它加载一个新的“Logica”,就像我创建了一个新的一样

单例本身并没有说它不能序列化;您可以为任何类编写不正确的序列化代码。现在还不清楚出了什么问题,我也不愿意仔细研究您的代码来找出问题所在,但这应该是可能的


IOException有一个空的catch块。那总是个坏主意。你已经接受了可能解释一切的例外情况。打印堆栈跟踪。

您描述的情况是不可能的。因此,你没有正确地描述它。你的观察结果可能有问题

我强烈怀疑IOException或FileNotFoundException,尽管您在另一个答案中有评论。您发布的代码至少在四个不同的位置忽略异常。这种假设是压倒性的

事实上,异常处理需要做很多工作。例如,如果出现异常,您不会关闭文件。没有最后一个街区。您有多个try/catch块,其中应该有一个try和多个catch


进一步的问题以及其他的询问。正在创建文件吗?长度非零?或者可能singleton类只有临时字段?

您的代码有什么不正确的地方?一句忠告:去掉所有Swing代码。以这种方式混合UI代码会降低类的可用性。没有秋千你不能用它。您是否希望在web应用程序中使用此类?太糟糕了。你也应该看看。简短回答:使用
Enum
singleton。Matt Ball是正确的,但这不能解释为什么不能序列化对象。不,它没有说明任何问题。实际上没有实际的错误,程序a只是不加载状态,它加载一个新的空“Logica”,就像我现在创建了一个新的一样。
    public void saving(String nome){

    ObjectOutputStream os = null;

    try {
        os = new ObjectOutputStream(new FileOutputStream(nome+".dat"));
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        return;
    } catch (IOException e) {
        // TODO Auto-generated catch block
        return;
    }
    try {
        os.writeObject(Logica.getLogica(null));
    } catch (IOException e) {
        // TODO Auto-generated catch block
        return;
    }
    JOptionPane.showOptionDialog(frame, "Game Saved sucessfully", "Load",
            JOptionPane.YES_NO_OPTION, JOptionPane.INFORMATION_MESSAGE,
            null, new String[] { "Ok" }, "Ok");
    if (os != null)
        try {
            os.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }