我是一个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
}
}
这两个中哪一个是更好的编码习惯?也应该最后阻止放置 尝试捕捉或它可以放在最后。
答案 0 :(得分:2)
使用Java 7并尝试使用资源。
try(Connection = pool.getConnection()) { // or any resource you open, like files
// ...
} // auto closes
此功能几乎已弃用finally
- 一旦添加此功能,我个人未找到finally
的用例,建议您避免使用此功能。就函数式编程而言,它就像goto
或可论证的continue
,甚至是for
循环 - 更新的功能使得使用不必要。
答案 1 :(得分:1)
最后块应该在try-catch之后放置。你想在哪里做数据的计算取决于你...但是如果你把它放在try-catch块之后,它将尝试计算,即使抛出异常,除非你使用一个条件。
答案 2 :(得分:0)
应该使用第二种方法,因为它可以更容易地对数据进行计算而不会遇到可变范围问题。但是,根据需要完成的计算,两种方式都可以工作。
答案 3 :(得分:0)
第二个。
有异常的想法是将它们抛出到检测到问题的位置,并且它们不会早于早期问题不再影响代码执行的第一点。可能通过在catch块中进行一些处理并使用finally块进行一些清理。
在第一个代码示例中,catch之后的代码仍然受到导致异常的错误的影响。所以你早就抓住了它。这意味着您可能需要在其周围添加if语句,这会不必要地增加函数的复杂性。
答案 4 :(得分:0)
这取决于您的系统细节,我看到两种可能的情况:
1)文件很大。然后你不能把它加载到memmory。你应该逐个阅读文件的pices,并在每个pice上做你的逻辑。这样可以防止你耗尽memmory。
2)文件很小。然后你可以选择,跟随第一个案例或读取memmory中的文件,关闭它然后处理它。
还有一个考虑因素:当文件未关闭时,其他进程无法访问它。如果您的逻辑很长,那么这可能是一个问题,在这种情况下,首先读取和关闭文件会更好。