2013-04-10 51 views
0

这可能是一个愚蠢的问题,但我一直无法在其他任何地方找到答案。我有一个类将读取和写入文件进行保存。现在,我正在尝试处理可能出现的一些可能的错误。我想知道的是,如果这是在Java中的法律或惯例:处理catch块中的异常?

try { 
    in = new ObjectInputStream(new FileInputStream(fileName)); 
    score = (Score)in.readObject(); 
} catch() { 
    ... 
} 

我遇到的问题是,如果该文件是空的,它无法读取该文件。程序会崩溃,所以我想知道的是通过常规方法在catch语句中创建文件中的某些数据,然后再次尝试/捕获它。然后在第二次捕捉时,我可以使程序崩溃。

我想要这样做的原因是用户擦除文件中的数据。

如果它是合法的,这是否是语法?

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

回答

1

为什么你不只是检查,如果该文件不存在,或者是空的,你尝试使用它之前?

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内的文件。

+0

是的,这绝对是一个可行的解决方案。我一直在想太久的人,这很难。 – 2013-04-10 02:50:50

0

在catch块中做这样的工作通常是不好的形式。如果你想在失败时重试,使用类似

int retryCount = 0; 
boolean success = false; 
while(!success && retryCount < 2) { 
    retryCount++; 
    try { 
     ... 
     success = true; 
    } catch (Exception ex) { 
     // log exception 
    } 
} 
+0

我明白你在哪里,但是如果我这样做,同样的代码会再次被触及,所以如果第一次尝试失败,没有文件被创建到哪里。如果我这样做了,我唯一能想到的事情就是在外观中创建一个if语句,以检查我们是否在第二次尝试。如果我们是那么我们创建文件,然后尝试。这种形式也不是这样吗? – 2013-04-10 02:47:28

+0

这并不理想,但我更喜欢在catch块中重试的重试循环中使用一个丑陋的if语句。我希望有一个更清洁的选择,但我画空白。 – 2013-04-10 02:54:45