Java 在catch块中处理异常?

Java 在catch块中处理异常?,java,exception,Java,Exception,这可能是个愚蠢的问题,但我在其他任何地方都找不到答案。我有一个类,可以读写文件以进行保存。现在,我正在尝试处理一些可能出现的错误。我想知道的是,这在Java中是合法的还是常见的做法: try { in = new ObjectInputStream(new FileInputStream(fileName)); score = (Score)in.readObject(); } catch() { ... } 我遇到的问题是,如果文件为空,它将无法读取该文件。程序将崩溃

这可能是个愚蠢的问题,但我在其他任何地方都找不到答案。我有一个类,可以读写文件以进行保存。现在,我正在尝试处理一些可能出现的错误。我想知道的是,这在Java中是合法的还是常见的做法:

try {
    in = new ObjectInputStream(new FileInputStream(fileName));
    score = (Score)in.readObject();
} catch() {
    ...
}
我遇到的问题是,如果文件为空,它将无法读取该文件。程序将崩溃,所以我想知道从catch语句在文件中创建一些数据,然后重试/catch是常见的还是常规的做法。然后在第二次捕获时,我可以使程序崩溃

我之所以想这样做,是因为用户删除了文件中的数据

如果它是合法的,这是语法吗

try {
    // try something here
} catch(//Exception here) {
    // Create a new file and try again.
    try {
        // try again
    } catch() {
        // Crash the program
    }
}

为什么不在尝试使用该文件之前检查它是否不存在或是空的

try {
    File file = new File( fileName);
    if( !file.exists() || file.length() == 0) { 
        // Create the file, initialize it with some default value
    }
    in = new ObjectInputStream(new FileInputStream( file));
    score = (Score)in.readObject();
} catch() {
    ...
}

请注意,存在一个小的竞争条件,用户可以在检查文件是否存在和在
FileInputStream

中实际使用文件之间删除该文件。在catch块中这样做通常是不好的。如果要在失败时重试,请使用类似

int retryCount = 0;
boolean success = false;
while(!success && retryCount < 2) {
    retryCount++;
    try {
        ...
        success = true;
    } catch (Exception ex) {
        // log exception
    }
}
int retryCount=0;
布尔成功=假;
而(!success&&retryCount<2){
retryCount++;
试一试{
...
成功=真实;
}捕获(例外情况除外){
//日志异常
}
}

我知道你的目的是什么,但如果我这样做,同样的代码会再次被触动,因此如果第一次尝试失败,文件不会在哪里创建。如果我这样做的话,我唯一能想到的就是在while look中创建一个If语句,检查我们是否在第二次尝试。如果是,则创建文件,然后重试。这不是也很糟糕吗?它不是很理想,但是我更喜欢在重试循环中使用丑陋的if语句,而不是在catch块中使用重试语句。我希望有一个更干净的替代方案,但我还是空白了。是的,这看起来确实是一个可行的解决方案。我想得太久了,伙计,这很难。