访问创建它的try / catch块之外的文件对象(Java)

时间:2012-09-11 00:59:40

标签: java

我想创建一个RandomAccessFile对象(在Java中)并写入并读取它。我的问题是,据我所知,我似乎需要在try / catch块中创建文件。如果我尝试在try / catch块之外创建它,然后像这样在块中初始化它,

RandomAccessFile valueFile; 

try
{
    valueFile = new RandomAccessFile("valuefile.txt", "rw");
    for (int i=0; i<numOfNums; i++)
        valueFile.writeDouble(randomizer.nextDouble()*200);
}
catch (Exception e)
{
    System.out.println("Couldn't find the values file.");
    System.exit(0);
}

for (int i=0; i<numOfNums; i++)
{
    double total = 0;
    valueFile.seek(0); // go to beginning of file to start reading it.
}

然后我得到错误“未报告的异常java.io.IOException;必须被捕获或声明被抛出”。 (我也得到“变量valueFile可能尚未初始化”。)

但是当我在try / catch中创建它时,就像这样,

try
{
    RandomAccessFile valueFile = new RandomAccessFile("valuefile.txt", "rw");
    for (int i=0; i<numOfNums; i++)
        valueFile.writeDouble(randomizer.nextDouble()*200);
}
catch (Exception e)
{
    System.out.println("Couldn't find the values file.");
    System.exit(0);
}

for (int i=0; i<numOfNums; i++)
{
    double total = 0;
    valueFile.seek(0);
}

我在程序的后半部分找到“找不到符号:变量valueFile”。我认为那是因为valueFile被认为是try / catch块的本地?但是,我如何创建valueFile,因此它的不是本地的try / catch块?

4 个答案:

答案 0 :(得分:5)

我认为你的第一种方法是正确的。错误不是由文件创建引起的,而是由valueFile.seek(0);调用引起的。这也可以抛出IO异常,因此您也需要在try / catch块中使用它。

编辑 正如Jon指出的那样,您的代码仍然无法编译,因为valueFile可能未初始化。只需将其初始化为null即可。

RandomAccessFile valueFile = null; 

您可以使用Jon的答案中描述的方法之一来说服编译器valueFile在到达valueFile.seek(0)时实际初始化。他的方法更安全,但只是初始化为null是一个很好的快速修复,因此您不必使用无法访问的throw语句来混淆代码。

但是,我认为如果只是移动声明,使用新RandomAccessFile进行初始化以及在同一try块内对文件进行所有访问,情况会更好。我想不出有什么好理由将它们分开。

答案 1 :(得分:4)

第一个版本几乎正确 - 但有两个问题:

  1. 您的方法未声明它可以抛出IOException,但您使用valueFile.seek可能会抛出异常。您需要更改方法声明,或捕获并处理异常。

  2. 编译器不知道System.exit(0)永远不会正常返回 - 它认为这是一种常规方法。所以你必须改变你的catch块,结束如下:

    return;
    

    throw new AssertionError("We'll never get here.");
    

    此时,编译器知道如果它超出了try / catch块,valueFile 是明确分配的。

  3. 请注意,如果您在catch区块中移动所有内容,这两个问题都会消失 - 但我建议您最好不要而不是捕获任何东西,而只是声明该方法可能抛出IOException

    public void foo(int iterations) throws IOException {
        RandomAccessFile valueFile = new RandomAccessFile("valuefile.txt", "rw");
        for (int i = 0; i < iterations; i++) {
            valueFile.writeDouble(randomizer.nextDouble()*200);
        }
    
        for (int i = 0; i< iterations; i++) {
            double total = 0;
            valueFile.seek(0);
            // Presumably you'd read the contents here?
        }
    }
    

    ...除非你还要关闭文件,如果你正在使用Java 7,或者只是尝试/最后使用try-with-resources语句阻止。

答案 2 :(得分:1)

RandomAccessFile valueFile; 

需要:

RandomAccessFile valueFile = null; 
  

(我也得到“变量valueFile可能尚未初始化”。)

解决上述问题。

答案 3 :(得分:0)

在try catch块之外声明变量,然后从其中加载。

RandomAccessFile valueFile;

try
{
    valueFile = new RandomAccessFile("valuefile.txt", "rw");
    for (int i=0; i<numOfNums; i++)
        valueFile.writeDouble(randomizer.nextDouble()*200);
}