3

我想创建一个 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

4 回答 4

6

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

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

RandomAccessFile valueFile = null; 

您可以改为使用 Jon 的回答中描述的一种方法来说服编译器valueFile在到达valueFile.seek(0). 他的方法更安全,但只是初始化到null是一个很好的快速修复,这样你就不必用无法访问的throw语句来混乱你的代码。

但是,我认为如果您只移动声明、使用 new 进行初始化以及对同一块RandomAccessFile中的文件的所有访问,那会更好。try我想不出有什么好的理由把他们分开。

于 2012-09-11T01:02:13.247 回答
5

第一个版本几乎是正确的——但有两个问题:

  1. 您的方法没有声明它可以 throw IOException,但是您的使用valueFile.seek可能会引发异常。要么您需要更改方法声明,要么捕获并处理异常。

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

    return;
    

    或者

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

    那时,编译器知道如果它超出了 try/catch 块,肯定会被分配valueFile

请注意,如果您将所有内容移到块内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 语句,否则仅使用 try/finally 块。

于 2012-09-11T01:01:55.413 回答
1
RandomAccessFile valueFile; 

needs to be:

RandomAccessFile valueFile = null; 

(I also get "variable valueFile might not have been initialized".)

To fix the above.

于 2012-09-11T01:29:38.983 回答
0

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

RandomAccessFile valueFile;

try
{
    valueFile = new RandomAccessFile("valuefile.txt", "rw");
    for (int i=0; i<numOfNums; i++)
        valueFile.writeDouble(randomizer.nextDouble()*200);
}
于 2012-09-11T01:02:15.280 回答