正确而有效的编程风格

时间:2012-07-12 17:24:47

标签: java exception coding-style refactoring

有一个班级X. X类中的方法method()会抛出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();
}

编辑:(在您的注释之后)

我更不用说我的代码了:

1。 tx.method()将抛出一个异常,因此下一件将被排除的事情是catch - 阻止。 temp仍为null并不重要,因为程序会跳过temp.doWhatever();行并且不会有NullPointerException

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

6 个答案:

答案 0 :(得分:1)

只有第一个是可能的,因为temp是在里面声明的。

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


更正问题后

亲优先

第一个代码具有较少的跳转指令,变量temp更加本地化,​​并且没有空初始化。

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

此外,应排除异常;它更容易阅读第一个版本。 例外情况不应该中断线性编码和阅读过程。

Pro second

更明确的是异常可以源于何处。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

第二种情况甚至不会编译(甚至没有意义),因为在temp块之外看不到try。无论如何,我会这样做:

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

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

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

由于初始化temp失败,其余temp操作不应执行。

答案 3 :(得分:0)

在方法中有多个返回值并不好。但这只是为了拥有可理解的代码。您可以避免使用布尔值和ifs返回。

我认为没有效率问题。如果在第一个语句中发生异常,则不执行第二个语句。如果没有异常那么......嗯...我认为由于第二种方法应该没有开销。您可以通过try catch:D

通知您“汇编程序”代码的外观

在我看来,编写不可靠的代码更为重要。现在的编译器非常好,并且可以优化最好的东西。

答案 4 :(得分:0)

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

此外,即使编译器仍然接受它,从catch块返回也会违反try / catch块的设计原则。为了使catch成为一个返回点,它应该抛出异常,因为由于异常情况而调用了该动作。

答案 5 :(得分:-1)

我认为这两种方法没有任何区别。