我想创建一个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块?
答案 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)
第一个版本几乎正确 - 但有两个问题:
您的方法未声明它可以抛出IOException
,但您使用valueFile.seek
可能会抛出异常。您需要更改方法声明,或捕获并处理异常。
编译器不知道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语句阻止。
答案 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);
}