如何处理 EOFException?
How to handle EOFException?
此代码 returns 一个 EOFException,对添加什么或如何处理问题有什么建议吗?
public AbstractBlock readBlock(int blockNum, AbstractDBFile f)
throws IOException {
DBFile dbf = (DBFile) f;
byte[] data2 = new byte[4096];
RandomAccessFile file = new RandomAccessFile(dbf.fileName, "r");
file.seek(4096+blockNum*4096);
Block b = new Block();
for (int i = 0; i < 4096; i++){
data2[i] = file.readByte();
}
file.close();
b.setData(data2);
return b;
}
函数readByte
可以抛出IOException
和EOFException
异常
public final byte readByte() throws IOException
Throws:
EOFException - if this file has reached the end.
IOException - if an I/O error occurs.
因此,如果您在分配给 data2[i] 变量
之前确实读过一些东西,那么您必须将它放在一个 try bloc 中,例如出海
您或许可以尝试这样做:
public AbstractBlock readBlock(int blockNum, AbstractDBFile f)
throws IOException {
DBFile dbf = (DBFile) f;
byte[] data2 = new byte[4096];
RandomAccessFile file = new RandomAccessFile(dbf.fileName, "r");
file.seek(4096+blockNum*4096);
Block b = new Block();
for (int i = 0; i < 4096; i++){
try{
data2[i] = file.readByte();
}catch(EOFException ex){
System.out.println("End of file reached!");
//break the loop
break;
}
}
file.close();
b.setData(data2);
return b;
}
假设 blockNum==1
... 这是否意味着您应该读取文件中的第一个块?如果是这样,您希望将 0
传递给 file.seek()
,但实际上传递的是 4096+4096*1 = 8192。这意味着对于给定的块号,您实际上正在读取第二个块过去了。
如果是这样,那么对于一个 n 块文件,如果您将 n
或 n-1
传递给此函数,您将得到一个 EOFException。
如果第一个块的编号是 0,而不是 1,那么您只差一个块,但基本问题仍然相同。
如果你的意思是'what should I do when I catch it?',你应该停止阅读并休息。如果你的意思是 'why am I getting it?',你的块编号应该从零开始,假设你对块的数量是正确的。
此代码 returns 一个 EOFException,对添加什么或如何处理问题有什么建议吗?
public AbstractBlock readBlock(int blockNum, AbstractDBFile f)
throws IOException {
DBFile dbf = (DBFile) f;
byte[] data2 = new byte[4096];
RandomAccessFile file = new RandomAccessFile(dbf.fileName, "r");
file.seek(4096+blockNum*4096);
Block b = new Block();
for (int i = 0; i < 4096; i++){
data2[i] = file.readByte();
}
file.close();
b.setData(data2);
return b;
}
函数readByte
可以抛出IOException
和EOFException
异常
public final byte readByte() throws IOException
Throws:
EOFException - if this file has reached the end.
IOException - if an I/O error occurs.
因此,如果您在分配给 data2[i] 变量
之前确实读过一些东西,那么您必须将它放在一个 try bloc 中,例如出海您或许可以尝试这样做:
public AbstractBlock readBlock(int blockNum, AbstractDBFile f)
throws IOException {
DBFile dbf = (DBFile) f;
byte[] data2 = new byte[4096];
RandomAccessFile file = new RandomAccessFile(dbf.fileName, "r");
file.seek(4096+blockNum*4096);
Block b = new Block();
for (int i = 0; i < 4096; i++){
try{
data2[i] = file.readByte();
}catch(EOFException ex){
System.out.println("End of file reached!");
//break the loop
break;
}
}
file.close();
b.setData(data2);
return b;
}
假设 blockNum==1
... 这是否意味着您应该读取文件中的第一个块?如果是这样,您希望将 0
传递给 file.seek()
,但实际上传递的是 4096+4096*1 = 8192。这意味着对于给定的块号,您实际上正在读取第二个块过去了。
如果是这样,那么对于一个 n 块文件,如果您将 n
或 n-1
传递给此函数,您将得到一个 EOFException。
如果第一个块的编号是 0,而不是 1,那么您只差一个块,但基本问题仍然相同。
如果你的意思是'what should I do when I catch it?',你应该停止阅读并休息。如果你的意思是 'why am I getting it?',你的块编号应该从零开始,假设你对块的数量是正确的。