2012-07-12 88 views
1

有一个类X. 方法method()在X类抛出SomeException正确和高效的编程风格

我不知道哪种处理异常的方法更好 - 效率更高。如果它围绕try-block方法抛出异常和所有依赖关系,或者在try-block之外保持依赖关系,但在失败后从方法返回。

1.

public void test() { 
    X x = new X(); 

    try { 
      T temp = tx.method(); 
      temp.doWhatever(); 
    } 

    catch(SomeException e) { handleException(e); } 
} 

2.

public void test() { 
    X x = new X(); 
    T temp = null; 
    try { 
      temp = tx.method(); 
    } 

    catch(SomeException e) { 
      handleException(e); 
      return; 
    } 

    temp.doWhatever(); 
} 

编辑:(注解之后)

更重要的是我undersand我的代码这样的:那么这将excetuted接下来的事情就是catch

1. tx.method()会抛出异常 - 块。它并没有消失,temp仍然是null,因为程序跳过temp.doWhatever();行,并且不会有NullPointerException

2. 这里我用return指令,因为我不想执行temp.doWhatever()因为tempnull

+0

选项1对我来说更加清晰 – Eric 2012-07-12 17:32:34

+0

(1)为什么一个'public void test'和另一个'public static void main'? (2)你意识到在第二块代码中,它意味着'temp.doWhat''不会有例外被捕获? – 2012-07-12 17:32:57

+0

@notfed:对于你的问题(2),虽然(我们可以假设没有任何东西被抛出),但OP没有提及任何关于'doWhatever'抛出'Exception'的信息。 – nhahtdh 2012-07-12 17:33:51

回答

0

第二种情况甚至不会编译(甚至没有意义),因为temptry块之外是不可见的。在任何情况下,我会去这样的:

public void test() { 
    X x = new X(); 

    try { 
      T temp = tx.method(); 
      temp.doWhatever(); 
    } 

    catch(SomeException e) { handleException(e); } 
} 

,因为如果初始化temp失败,则temp操作的其余部分应不会执行。

+0

“因为如果初始化temp失败,其余的temp操作不应该执行。” 我同意你的看法,这就是为什么我把第二个例子放回去的原因。 – squixy 2012-07-12 18:11:01

+0

@squixy:现在你的两个片段是相同的。我仍然会选择第一个,因为不建议在方法中散布“return”语句,因为它更难以理解代码的行为方式。 – Tudor 2012-07-12 19:46:49

-1

我看不出这两种方法有什么区别。

+0

他们做什么没有区别......但这是一个_coding style_问题。这才是重点。 – Eric 2012-07-12 17:31:43

1

只有第一个可能,因为临时声明在里面。

我个人选择第一个,否则需要在尝试之前声明:T temp = null。

临第一

第一个代码少跳转指令和变量temp是更多的地方,并且无空初始化:


问题的修正之后。

此外,编码风格更紧凑,没有空初始化,可能的错误点。

此外,异常应该保持在视野之外;它更容易阅读第一个版本。 异常不应该中断线性编码和读取过程。

Pro的第二

更清楚其中的异常可以干。

+0

现在编辑。 – squixy 2012-07-12 18:09:59

1

异常工作方式的一个关键点是您可以使用您的样式编号1:让一个代码块放心地执行,无论它何时中断,流程都会中断并处理错误。所以我会一直建议第一种风格。

0

在方法中有多个返回是不好的。但那只是为了有可理解的代码。您可以通过布尔和ifs避免返回。

我认为没有效率问题。如果第一条语句发生异常,则不执行第二条语句。如果没有例外,那么...嗯...我认为应该没有开销,因为第二种方法。你可以通过try catch告诉你“汇编器”的代码是怎么样的:D

在我看来,编写难以置信的代码更重要。现今的编译器非常好,优化了最好的东西。

0

选项二由于可扩展性原因而不利。假设稍后有人决定test()应该在test.doWhatever()之后做某件事情,即使遇到异常情况。他们必须在当时重新将代码重构为选项一。由于从一开始就使用选项1没有成本,所以他们不应该这样做。

此外,尽管编译器仍然会接受,但try/catch块的设计原则被catch块返回所侵犯。对于捕获是一个返回点,它应该抛出一个异常,因为由于特殊情况而调用该操作。