JAVA如果文件存在,请尝试反序列化。否则就不要';T

JAVA如果文件存在,请尝试反序列化。否则就不要';T,java,serialization,try-catch,filenotfoundexception,Java,Serialization,Try Catch,Filenotfoundexception,我正在使用序列化为我的库管理应用程序获取持久存储(我知道这不是正确的方法,但这是我教授想要的方法) 我在main()中使用以下代码: 我的Serializador类具有abirarchivo(“FileName.dat”)函数(openFile为英语) 该函数如下所示: public Object abrirArchivo(String nombreDelArchivo) { Object retorno = null; try { lectorArchivos

我正在使用序列化为我的库管理应用程序获取持久存储(我知道这不是正确的方法,但这是我教授想要的方法)

我在main()中使用以下代码:

我的Serializador类具有
abirarchivo(“FileName.dat”)
函数(openFile为英语)

该函数如下所示:

public Object abrirArchivo(String nombreDelArchivo) {
    Object retorno = null;
    try {
        lectorArchivos = new ObjectInputStream(new FileInputStream(
                nombreDelArchivo));
        retorno = lectorArchivos.readObject();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
    return retorno;
}
现在我尝试检查程序是否为任何文件获取FileNotFoundException。如果是这样的话,它就不应该反序列化该文件并继续下一个:这意味着我的库中还没有书

问题是,如果行运行,它似乎会使用
setListaLibros()
将我的图书列表设置为null。每当我试图访问该列表时,就会得到一个NullPointerException。该列表已初始化为空列表,因此只要找不到“libros.dat”文件,我就不必理会它


要做到这一点,正确的方法是什么

您可以在此之前添加一行:
controlador.getBiblioteca().getGestorMaterial().setListaLibros((Modelo.ColeccionLibros)controlador.getSerializador().abrirArchivo(“libros.dat”)检查文件是否存在。如果没有,则会提示用户。这样,用户就知道出了什么问题,可以采取相应的行动

或者,您可以在
setListLibros
方法中进行更改,其中,如果传递的参数为
null
,则不执行任何赋值

就我个人而言,我会选择第一种选择


作为旁注,请将您的代码分解如下:
controlador.getBiblioteca().getGestorMaterial().setListaLibros((Modelo.ColeccionLibros)controlador.getSerializador().abirarchivo(“libros.dat”))
可能难以读取和调试。

您可以检查文件是否存在,如:

字符串文件名;
文件f1=新文件(文件名);
if(f1.exists()){
//做这项工作
} 

我不知道我是否理解这个问题。但是,正如我在代码中看到的,当发生异常FileNotFoundException时,“Returno”将保持null。这就是为什么会得到setListaLibros(null)。
然后您的列表将变为空。如果您不希望出现这种行为,那么应该使用空列表而不是空列表来初始化“returno”。

有一个方面其他答案没有提到:为什么库为空时没有序列化对象

我的意思是:您可以区分“程序第一次运行”(显然不存在序列化数据)和“程序以前运行过”;因此,它可以根据序列化数据完全配置自己


意思是:“为空”也可以是库的有效状态。因此,另一种选择是不使用“特殊值”(也称为“无数据文件”)来表示该信息…而是(反)序列化空列表。

提示:那些流畅的调用,你一个接一个地调用…尽量不要这样做。相反,请阅读“德米特定律”“并且要明白,如果你得到了一些东西去做一些事情,那真的很糟糕。这听起来不错,问题是,我还必须发送空文件,并告诉教授在运行项目之前将它们存储在他存储的地方。这是我的第一个解决方案,但我希望能够在没有这些文件的情况下运行程序。不,您不必分发“空”文件。您的应用程序在第一次启动时创建它们!如果是第一次运行,您现在如何制作应用程序?虽然我选择了npinti建议的方法,但我确实喜欢这种方法。事实上。。。说得好。可能是这样的:当程序启动时,它会检查是否有带有反序列化对象的文件。如果没有,它会立即为“空”创建一个。但这可能需要更多的思考。我会在它上面睡觉;也许下周我有个主意;-)实际上,我认为第二种选择可能是正确的解决方案。我一回到电脑旁就试试看。谢谢你把代码的想法分解了。写了几天后,我也很难读懂我的台词。我也将对此进行研究。我使用该函数来反序列化Object类型的对象,这就是它返回的结果。然后我让它们成为书籍列表(铸造)或其他类型的对象。如果我想让Retrono成为一个列表,它就不能再是一个对象了,我将失去我的施法机会。在这种情况下,你应该用一些有意义的东西初始化Retrono,并将其传递给setListaLibros,然后它将从中创建一个空列表。这种设计通常被称为“空对象设计模式”。我建议你用谷歌搜索一下,这样你就能想出一个合适的设计。
public Object abrirArchivo(String nombreDelArchivo) {
    Object retorno = null;
    try {
        lectorArchivos = new ObjectInputStream(new FileInputStream(
                nombreDelArchivo));
        retorno = lectorArchivos.readObject();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
    return retorno;
}