【发布时间】:2011-02-07 16:42:41
【问题描述】:
有人告诉我,使用 Java 的 try-catch 机制会产生一些开销。因此,虽然有必要将抛出已检查异常的方法放在 try 块中以处理可能的异常,但从性能角度来看,最好将 try 块的大小限制为仅包含可能抛出异常的那些操作。
我不太确定这是一个合理的结论。
考虑以下两个处理指定文本文件的函数的实现。
即使第一个确实会产生一些不必要的开销,我发现它更容易理解。仅通过查看语句就不太清楚异常究竟来自何处,但 cmets 清楚地显示了哪些语句是负责任的。
第二个比第一个更长更复杂。特别是,第一个很好的读行习惯必须被破坏以将readLine 调用放入 try 块中。
在定义中可能引发多个异常的函数中处理异常的最佳做法是什么?
这个包含try块内的所有处理代码:
void processFile(File f)
{
try
{
// construction of FileReader can throw FileNotFoundException
BufferedReader in = new BufferedReader(new FileReader(f));
// call of readLine can throw IOException
String line;
while ((line = in.readLine()) != null)
{
process(line);
}
}
catch (FileNotFoundException ex)
{
handle(ex);
}
catch (IOException ex)
{
handle(ex);
}
}
这个只包含在 try 块中抛出异常的方法:
void processFile(File f)
{
FileReader reader;
try
{
reader = new FileReader(f);
}
catch (FileNotFoundException ex)
{
handle(ex);
return;
}
BufferedReader in = new BufferedReader(reader);
String line;
while (true)
{
try
{
line = in.readLine();
}
catch (IOException ex)
{
handle(ex);
break;
}
if (line == null)
{
break;
}
process(line);
}
}
【问题讨论】:
-
“过早优化”是一个短语,用于描述程序员让性能考虑影响一段代码的设计的情况。这可能会导致设计不如原本的干净或代码不正确,因为优化会使代码复杂化,而程序员会因优化而分心。 - 维基百科 [en.wikipedia.org/wiki/Program_optimization#When_to_optimize]
-
“我们应该忘记小的效率,比如说大约 97% 的时间:过早的优化是万恶之源。但我们不应该放弃那关键的 3% 的机会。” - 克努斯 [stackoverflow.com/questions/211414/…
-
过早的优化是一切科学的根源。
标签: java exception-handling readability