5

我是一个java新手。我有一个关于在使用 try catch finally 块时如何组织 java 代码的问题。假设我必须阅读一些文本文件并对存储的文件内容进行一些计算。我的代码应该如何?

例如

代码 1 看起来像:

public static void main(String[] args){

try{

//open files using BufferedReader, read and store the file contents.

}catch(IOException e){

e.printStackTrace();

}
finally{

//close the files

}
// do computations on the data
}

代码 2 看起来像:

public static void main(String[] args){

try{

//open files using BufferedReader, read and store the file contents.

// do computations on the data

}catch(IOException e){

e.printStackTrace();

}
finally{

//close the files

}
}

两者中哪一个是更好的编码实践?也应该在 try catch 之后放置 finally 块,或者它可以放在最后。

4

5 回答 5

2

使用 Java 7 和 try-with-resources。

try(Connection = pool.getConnection()) { // or any resource you open, like files
// ...

} // auto closes

此功能接近弃用-一旦添加此功能,finally我个人还没有找到用例,建议您避免使用它。finally就函数式编程而言,它就像goto或可以说是循环continue,甚至是for循环——更新的特性使得使用变得不必要。

于 2013-03-09T04:55:26.120 回答
1

finally 块应该放在 try-catch 之后。你想在哪里对你的数据进行计算取决于你......但如果你把它放在 try-catch 块之后,即使抛出异常,它也会尝试计算,除非你使用条件。

于 2013-03-09T04:54:18.970 回答
0

应该使用第二种方法,因为它会更容易对数据进行计算而不会遇到变量范围问题。但是,这两种方式都可以根据需要完成的计算工作。

于 2013-03-09T05:01:21.150 回答
0

第二。

异常的想法是,您将它们扔到检测到问题的地方,并且它们被捕获的时间不早于早期问题不再影响代码执行的第一个点。可能通过在 catch 块中进行一些处理并使用 finally 块进行一些清理。

在您的第一个代码示例中,catch 后面的代码仍然受到导致异常的错误的影响。所以你很早就抓住了它。这意味着您可能必须在其周围添加一个 if 语句,这会不必要地提高函数的复杂性。

于 2013-03-09T06:39:59.937 回答
0

这取决于您的系统细节,我看到两种可能的情况:

1)文件很大。然后你不能将它加载到内存中。你应该一个一个地阅读文件的图片,并在每一个图片上做你的逻辑。这将防止您耗尽内存。

2)文件小。然后你有一个选择,是跟随第一个案例还是读取内存中的文件,关闭它然后处理它。

还有一个考虑:虽然文件没有关闭,但其他进程无法访问它。如果您的逻辑很长,这可能是一个问题,在这种情况下,首先读取和关闭文件会更好。

于 2013-03-09T08:46:51.727 回答